java设计模式之代理模式

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

回到顶部