一天学一个模式_第二天:代理模式
概念:
代理模式,也有人称为委托代理模式。代理模式是软件设计模式中的一项基本技巧。
在代理模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。
代理模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了代理模式。
委托模式使得我们可以用聚合来替代继承,它还使我们可以模拟mixin。
角色:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。
同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
步骤:
(①②步比较菜,忽略。有异议者联系!)
①首先还是接口。将要代理的所有东西(这里举的例子是鞋子)的接口。
②定义某某公司,继承接口。
③定义代理人,继承接口。
/**
* @author wonter
* <b>描述:</b>就比如我要做这个代理商,我就要继承卖鞋子这个接口(XieZ)。<br>
* <b>邮件:</b> yiyu1@163.com <br>
*/
public class Wonter implements XieZ {
private XieZ xiezi;
//你可以默认做阿迪达斯的代理
public wonter(){
this.xiezi = new adidas();
}
//也可以是XieZ中的任何一家公司的代理,只要你是这一类型
//这里类型是XieZ接口,但传入的则是“实现”接口的公司。
public Wonter(XieZ gongsi){
this.xiezi = gongsi;
}
public void bsktb() {
this.xiezi.bsktb(); //我只是代理,替公司卖鞋子
}
public void ftb() {
this.xiezi.ftb(); //我只是代理,替公司卖鞋子
}
}
④最后到了定义买家的时候了。
/**
* @author wonter
* <b>描述:</b>定义买家 <br>
* <b>邮件:</b> yiyu1@163.com <br>
*/
public class MaiJia {
public static void main(String[] args) {
//找到我代理的店铺
Wonter wonter = new Wonter();
//在我这选择你喜欢的鞋子。
//注意的是,虽然表面上是我在鞋子,但实际上却是某某公司在卖鞋子。
wonter.bsktb();
wonter.ftb(); }
}
}
例如:此时又有一家公司(nike)找我做代理。相同的是:nike公司也是继承了XieZ这个接口。
它也拥有XieZ接口中的所有功能。(或者还有XieZ接口中没有的功能,nike公司独有的功能)
这下我该怎么办呢?
/**
* @author wonter
* <b>描述:</b>此时又有一家公司(nike)找我做代理。 <br>
* <b>邮件:</b> yiyu1@163.com <br>
*/
public class MaiJia {
public static void main(String[] args) {
//做代理,也要先找到合适的公司吧。首先选定公司。
Nike nike = new Nike();
//详见wonter.java中
//wonter继承XieZ接口,传入nike公司,改写wonter方法。
//这样,我就nike公司的所有鞋子,成了nike公司的代理人了。
Wonter wonter = new Wonter(nike);
//在我这选择你喜欢的鞋子。
wonter.bsktb();
wonter.ftb();
}
}
好处:
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。
在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
/**
* @author wonter
* <b>描述:</b> 一天学一个模式 更新中,请关注我的weibo! <br>
* <b>微博:</b>:http://weibo.com/wontter
<br>
* <b>邮件:</b> yiyu1@163.com <br>
*/
加微信:wonter 发送:技术Q
医疗微信群:
加微信:wonter 发送:医疗Q
更多文章关注公众号:
![](https://images.cnblogs.com/cnblogs_com/Javame/604499/o_cto.png)