java设计模式之 -代理模式
代理模式(Proxy Pattern)
一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
举个例子:
跟 MM 在网上聊天,一开头总是 “hi, 你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?” 这些话,真烦人,写个程序做为我的 Proxy 吧,凡是接收到这些话都设置好了自己的回答,接收到其他的话时再通知我回答,怎么样,酷吧。
代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。
客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。
代理就是中介,中间人。法律上也有代理,比如代理律师之类,委托人将自己的一部分权限委托给代理者,代理者就拥有被代理者(委托人)的部分权限,并且可以以被代理人的名义来实行这些权限(委托模式和代理模式非常的像,区别在与代理类是开放出去供人调用,委托类的执行过程调用者是看不到的)
此时代理者与委托人等同,当然代理人也可以在实行权限时配合自己的能力来进行,当然不能超出这个权限。
另外代理模式和装饰器模式特别的像,尤其体现在代码上。
总结:1、加以控制 2 、添加功能
以静态代理举例
一、静态代理
1创建接口 Car
/**
* 总类
*/
public interface Car {
void run();
}
2、被委托类-被代理类
public class Train implements Car { public void pickUpGoods(){ System.out.println("拉货"); } public void pickUpPeople(){ System.out.println("拉人"); } @Override public void run() { System.out.println("火车跑"); } }
3、代理类-代理站点
/** * 代理站点 --所有的都是来源于Car ,这个代理类代理的是train,以后train的事情都会由TrainCarProxy来进行代理, * 你能在使用Train这个类了,这个就是和装饰类最大区别 */ public class TrainCarProxy implements Car { @Override public void run() { new Train().run(); } }
测试类:
Car car =new TrainCarProxy(); car.run();
运行结果:
总结:
原有的类不会暴露出来,不会修改的原有的类可以加以保护。
缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护.