java设计模式之代理模式
·定义
代理模式(Proxy)为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。
设计环境:我要去国外旅游,就要买飞机票,去飞机场是可以买到的,但是去飞机场太远了,麻烦,那么我可以通过网上或者是一些售票点可以买到机票。那么网上和售票点就是我的代理(代理类)。
代码实现:
设计一个售票服务接口,定义一个售票的功能。
public interface SellService{//售票功能
public void sellTickets();
}
定义一个飞机场,飞机场有售票功能。
public class AirPort implements SellService{//实现售票功能
public void sellTickets(){
System.out.println("售出飞机票");
}
}
设计代理类---售票代理
public class SellProxy implements SellService{private AirPort ap;
public SellProxy(AirPort ap){
super();
this.ap=ap;
}
public void sellTickets(){
//代理前代码,
...
ap.sellTickets();
//代理后代码
...
}
}
测试类
public class ProxyTest{public void main(String[] args){
SellService ss = new SellProxy(new AirPort());
ss.sellTickets();
}
}
代理模式算是完成了。但是这样的设计不够通用。代理类构造函数接受了必须是AirPort或者是他的子类。如果我想买火车票,又要重新设计一个买火车票的代理类。我要买动车票,又要设计个买动车票的代理类,如果类似这样的情况很多,这样就显得太麻烦了。所以我们重新设计上面的代理类。
网上和售票点都是可以卖多种票种的,机票,火车票,动车票,大巴等等,那么设计的代理类也要有这样的功能。我就跟代理类说,我要买火车票,他帮我把火车票买了,我要买飞机票,他帮我把机票买了。那么那些售票点是怎么样可以卖多种票的呢。可以想象下,老板打开门做生意就说,我可以卖:机票,火车票,动车票,大巴票,别的票我还卖不了。我跟老板说要机票,好,他有卖,那他进入卖机票的系统,帮我买票。但是他这个卖机票的系统不是他一开店就有的吧,他应该是注册或者是怎么弄来的是他的事。就由老板操作买票了,但是票不是他出的,他交给了卖机票的系统完成。也许老板买票前还要我的身份证啊,或者别的。买完票后,然后他把票给我啊,我需要把钱给他啊,没事我就可以走了。整个流程就是这样的。
代码如下:
public class StrongerSellProxy implements SellService{private SellService ss;
public StrongerSellProxy (SellService ss){
super();
this.ss=ss;
}
public void sellTickets(){
//代理前
...
ss.sellTickets();
//代理后
...
}
}
测试:
public class ProxyTest1{public void main(String[] args){
SellService ss = new StrongerSellProxy(new AirPort());
ss.sellTickets();
}
}
如果我想买火车票,就设计一个售火车票的具体类,实现售票功能,然后将这个具体实现传给代理类,让他去做。
总结:这个代理类就是具体对象的替身,用他来控制对这个体对象的访问,用他来控制交给谁处理。这个代理类要持有具体对象的引用。
结合上面售票讲解,映射到代码层面来。
代理类:老板开售票点,打开门做生意,就是代理类。
卖票接口:老板开店就是卖票的,不干别的(要是还有别的也可以),那么就有售票的功能。
售票引用:老板开店了需要向具体的系统注册了才能卖相应的票种,这些系统都是有售票功能的,只要我注册的才能买,没注册的不能(我可以帮你买我卖的票种,不是的我买不了)。
通过上面生活中的例子讲解,希望对你理解代理模式有所帮助,这些也是本人的愚见,若有错误之处,请指出,共同学习。
以上是 java设计模式之代理模式 的全部内容, 来源链接: utcz.com/z/392479.html