代理模式---静态代理

一,静态代理介绍

  • 了解设计模式中的代理模式的同学应该都知道如果想要为被代理类生成代理,需要让代理类和被代理类共同实现同一个接口,在代理类中增加额外逻辑来实现代理模式,这种方式在编译期间就已经确认了哪个类是代理类,被代理的又是哪个类,这都是需要开发人员在编译之前就编写好的,是为静态

1,代理模型的角色分析

  • 抽象角色:一般会使用抽象类或者接口实现
  • 真实角色:实体类,被代理的角色
  • 代理角色:代理真实角色,而且可以附属一些其他操作
  • 使用角色:使用代理角色进行操作

2,静态代理模式的优点

  • 可以使真实角色更加纯粹,不用去关注一些公共的事情
  • 公共的业务由代理来完成,实现业务的分工
  • 公共业务的要扩展的话,可以更加集中和方便

3,静态代理模式的缺点

  • 因为代理对象,需要实现与目标对象一样的接口,会导致代理类十分繁多,不易维护,同时一旦接口增加方法,则目标对象和代理类都需要维护

二,模拟静态代理的例题

  • 用静态代理打个比方,比如说:一个房东要出租房屋,他会贴一个公告说有房出租,同时房屋中介也会帮房东发布公告,在说明房东意图的同时还会做一些其他的事,比如带客户看房,收取中介费等...。这里的房东就是真实角色,发布的公告就是抽象角色,中介就是代理角色,租房的人就是使用角色,真实角色和代理角色都会实现抽象角色中的方法,就像是房东和中介都会发布公告,但是中介在发布公告的同时还可以实现其他的操作

1,代码

抽象角色

1 //租房的接口:抽象
2 public interface Rent {
3     //出租公告
4     void rent();
5 }

真实角色

1 //房东
2 public class Host implements Rent {
3
4      //出租公告
5     public void rent(){
6         System.out.println("出租房子");
7     }
8
9 }

代理角色

 1 //房屋中介
 2 public class Proxy implements Rent {
 3
 4     //房东
 5     private Host host;
 6
 7     public void setHost(Host host) {
 8         this.host = host;
 9     }
10
11     public void rent() {
12         lookHouse();
13         host.rent();
14         fare();
15     }
16
17     private void lookHouse(){
18         System.out.println("中介带你看房");
19     }
20
21     private void fare(){
22         System.out.println("收取中介费");
23     }
24
25 }

测试

 1 public class You {
 2     public static void main(String[] args) {
 3
 4         Host host = new Host();
 5
 6         Proxy proxy = new Proxy();
 7         proxy.setHost(host);
 8         proxy.rent();
 9
10     }
11 }

2,运行结果

原文地址:https://www.cnblogs.com/tqsh/p/11304043.html

时间: 2024-09-30 21:11:14

代理模式---静态代理的相关文章

Java代理模式——静态代理模式

一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计到的角色 抽象角色:声明真是对象和代理对象的共同接口(抽象类或接口). 代理角色:代理对象角色内部含有对真是对象的引用,从而可以操作真是对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真是对象.同时,代理对象可以在执行真实对象的操作时,附加其他操作,相当于对真是对象进行封装. 真实

代理模式-静态代理与动态代理

简介 首先感谢沽泡学院 tom 老师 代理模式是一种结构型模式 代理模式就是代理对象帮被代理对象处理一些问题, 类似中介, 客户只要结果, 中介怎么搞是他的事儿, 他可能再处理过程中赚外快什么的 代理模式的应用: spring中的aop, 日常工作中记录日志, 统计时间,权限控制等 这里我们使用一个客户端代理访问google举例, 具体细节可能不合适, 意会.意会.意会... 静态代理 /** * 一个服务器接口, 服务器有很多功能, 可以用来路由, 建站等... */ public inter

【Java】代处理?代理模式 - 静态代理,动态代理

>不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算,见[Java]Float计算不准确) package com.nicchagil.study.java.demo.No09代理.No01不用代理; import java.math.BigDecimal; public class FloatCalculator { public float add(fl

java 设计模式 - 代理模式 - 静态代理

代理模式:使用环境无法直接使用对象A(委托对象),可以使用对象B(代理对象)调用对象A已达到直接调用对象A的效果,就成为代理模式. 其中A为委托对象,B为代理对象. 静态代理的优缺点: 优点: 1.代码只管,可以清楚理解委托雷以及代理类. 2.在编译期加入,提前就指定好了委托类,代理类,效率高. 缺点: 1.静态代理很麻烦,需要大量的代理类,不易于代码维护等 当我们有多个目标对象需要代理时,我就需要建立多个代理类,改变原有的代码,改的多了就很有可能出问题,必须要重新测试. 2.重复的代码会出现在

代理模式(静态代理)的通俗理解

代理模式分为两种:静态代理和动态代理. 首先不谈模式,举一个例子: 有一队很美丽的妹子,她们都是训练有素的迎宾小姐.平时忙于训练再加上人脉与广告投入不多,生意并不好.于是她们的老大提议去找一个礼仪公司合作,请他们把迎宾的活儿包给她们来做.恰好在某个公司有个接待外宾的活动,该活动交给一个这个知名的礼仪公司负责,礼仪公司就通知了迎宾小姐.在外宾下车时就要乐队奏乐,走到公司门口时,迎宾小姐需要致以问候.现在来模拟一下这个情景. //相当于迎宾小姐(委托类) public class HelloWorl

zbb20180930 代理模式 -静态代理-jdk动态代理-cglib动态代理

CGLIB与JDK动态代理区别 区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理.而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理. 1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2.如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3.如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB

代理模式(静态代理)(工厂模式9)

//抽想角色定义代理角色与实际角色的对外开放的方法: //真实角色: //代理角色: 代理角色可以做很多东西,但不会做真实角色的独有属性(如唱歌) 只有通过真实角色的应用,调用真实角色方法,才可以真正的对症是角色 的代理: private RealStar realStar; public Proxy(RealStar realStar){ this.realStar= realStar; } 客户: 根据测试结果,只有sing()是本人执行,其他都有代理角色执行 类图:

Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为代表 1 1.2. JDK动态代理是模拟接口实现的方式,cglib是模拟子类继承的方式1 1.3. CGLIB代理模式的缺点 在static和final方法上应用横切关注点也是无法做到的.2 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 

设计模式--5.4 代理模式-动态代理

1.动态代理 (1)动态代理,是实现阶段不关心代理谁,而在运行阶段才指定代理哪一个对象.相对的说,上面两种 普通代理和强制代理,都是通过写代理类来获取代理,这种是静态代理. (2)区别:静态代理,需要写代理类,在代理之前要知道我代理的是哪个类: (3)类图 2.代码 接口类 package com.design.代理模式.动态代理; public interface IGamePlayer { void login(String username , String pwd); void kill