您的位置:首页 > 其它

设计思想学习—代理模式

2017-12-29 17:41 267 查看

代理模式

代理模式(Proxy):给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

代理模式组成

抽象角色(Abstract):通过接口或抽象类声明真实角色实现的业务方法。

代理角色(Proxy):实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

真实角色(Real):实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

UML图



个人想法

代理模式就好比是房屋中介一样,房东不和租房者直接对接,或者说房东不在房子所在地不方便过来,所以委托了代理来完成出租的事情。

同样的道理程序中的代理模式也是因为一个类不方便或者不能直接引用另一个对象,而代理对象可以在中间起到连接的作用。就像下图的关系



代理模式分类

代理模式有很多种:虚拟代理、技术代理、远程代理等等

但是从编译运行角度来讲只有两种:静态代理、动态代理。

静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。

其中动态代理主要使用反射的原理来实现,这里不做研究。

通过静态道理来理解代理模式的设计思想。

静态代理

//抽象角色
interface Renting{
void rentingHouse();
}
//房客
class Clientele implements Renting{
public void rentingHouse() {
System.out.println("想要租个房子,但是找不到房源");
}
}
//代理中介
class Proxy implements Renting{
private Clientele clientele;
public Proxy(Clientele clientele){
this.clientele=clientele;
}
public void rentingHouse() {
clientele.rentingHouse();
System.out.println("我是中介我帮你找房子");
System.out.println("房子找到了,租给你");
}
}
public class Client {
public static void main(String[] args) {
Renting re=new Proxy(new Clientele());
re.rentingHouse();
}
}


输出:

想要租个房子,但是找不到房源

我是中介我帮你找房子

房子找到了,租给你

看到这里是不是开始有点混乱了这个跟装饰者模式是不是很像,跟适配器模式是不是很像同样是连接了两个类。

设计模式总是通过增加层来进行解耦合,提高扩展性,但是如果我们没法从在这个抽象维度中看出,这个层真正的抽象含义。

那么我们很难搞懂一个模式真正的内涵?我就有这个疑问,这两个东东都是增加了一层,但是这一层有什么区别?

因为没有彻底的理解设计思想所以有了很多问题,我也去看了许许多多的博客、论坛和查百度,最后有了一点点收获,不过后面也查到很多模式在外面看来都是很相似,所以我准备把这一系列问题放在后面的博客中一一研究。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息