前言
代理模式是一个大类,而且会经常用到,它包含了远程代理,虚拟代理,防火墙代理等,当然还有动态代理了,学过spring的人应该不陌生。各种代理模式样式差别很大,不容易从程序上辨认,但是可以从功能上认出来,今天我就举个例子聊聊代理模式最基本的样子,从例子中认识代理模式。举例为静态代理的基本应用,稍后再介绍代理模式的一些特点。情境引入
本次我们以滴滴为例,滴滴在8.23接到乘客的投诉电话,因此是可以接受投诉的,只不过投诉处理不及时,而8.24日,警方打电话给滴滴客服,滴滴客服却没有权限查询犯罪嫌疑人的出车记录,说明滴滴客服只是滴滴的一个代理,而有权限的做查询的则是滴滴公司。因此本本例中滴滴客服作为代理,代理滴滴公司。
角色组成(代理模式的基本组成)
抽象主题角色
一个抽象接口(滴滴)
具体主题角色
需要被代理的对象(滴滴公司)
代理角色
对象的代理(滴滴客服)
程序类图
java源程序
滴滴接口
package proxy_08;
public interface Didi {
public void complain();
public void queryCarRecord();
}
滴滴公司(主题)
package proxy_08;
public class DidiCompany implements Didi{
public void complain() {
System.out.println("收到投诉,请耐心等待处理结果");
}
public void queryCarRecord() {
System.out.println("正在查询出车记录,请耐心等待");
}
}
滴滴客服(代理)
package proxy_08;
public class DidiCallCenterProxy implements Didi{
DidiCompany didi;
public DidiCallCenterProxy(DidiCompany didi) {
this.didi=didi;
}
public void complain() {
didi.complain();
}
public void queryCarRecord() {
System.out.println("不好意思,一线客服没有权限,请去总公司查询");
}
}
客户端
package proxy_08;
public class Client {
public static void main(String[] args) {
DidiCompany dc=new DidiCompany();
Didi didi=new DidiCallCenterProxy(dc);
didi.complain();
didi.queryCarRecord();
}
}
运行结果
实例分析
从举例中我们可以看出 ,由于代理与被代理实现了相同的接口,因此代理模式可以代理对象的方法,而代理模式的一个用处也就显而易见了,代理模式可以有选择的暴露对象的接口,而对访问者屏蔽一些接口,这样就实现了对对象的控制访问。当然代理模式用途细分就比较多了,但核心都完成了对被代理对象的控制访问。
现在我们在重新看代理模式 就应该清楚多了
定义
代理模式为对象提供一个替身或者占位符以控制对这个对象的访问
应用场景
应用远程代理控制访问远程对象虚拟代理控制访问创建开销大的对象保护代理基于权限控制对资源的访问动态代理去看aop就行了代理模式优点
实现了访问者与访问对象之间的解耦代理模式在客户端与对象之间起到中介作用,保护了对对象的访问代理模式可以在访问过程中增加逻辑(aop)缺点
增加代理会使程序请求处理变慢
代理模式与装饰者模式对比
看类图就知道代理模式和装饰者模式长的是真像,但是说区分他们也容易
差别
代理模式
装饰者模式
相同点
都有统一的接口
相同点
代理模式和对象都实现了接口
装饰者和对象也实现了接口
相同点
都完成了对对象的包装
不同
代理包装对象是为了控制对对象的访问
装饰者是为了给对象添加行为
运用简单工厂
由于对象的生成放在了客户端,我们可以轻易看出运用了代理模式,现在我们用简单工厂封装一下对象的创建,在看看客户端有什么变化,还能不能认出来应用了代理模式呢?
引入简单工厂
package proxy_08;
public class DidiFactory {
Didi didi;
public Didi getInstance(){
didi=new DidiCallCenterProxy(new DidiCompany());
return didi;
}
}
修改客户端(别的类不用动)
package proxy_08;
public class Client {
public static void main(String[] args) {
DidiFactory df=new DidiFactory();
Didi didi=df.getInstance();
didi.complain();
didi.queryCarRecord();
}
}
相关知识
xcode 报“Remote object proxy returned error: Error Domain=NSCocoaErrorDomain Code=4099 ”The connec...
永生花 代理厂家
上海鲜花进口报关代理公司
手撕Java系列
木槿花家居饰品加盟 加盟费多少钱 连锁电话 代理条件
「花卉货运代理」花卉货运代理公司黄页
「花卉租赁代理」花卉租赁代理公司黄页
Envoy 代理开源五周年,创始人 Matt Klein 亲述开源心路历程及经验教训
招募代理广告语
上海机场永生花进口报关代理公司 花卉报关代理
网址: 代理模式(proxy) https://m.huajiangbk.com/newsview561463.html
上一篇: 淘客系统怎么同步订单 |
下一篇: 鲜花销售系统详细设计与具体代码实 |