代理模式(Proxy、Subject、RealSubject)(代购火车票)
.(为其他对象提供一种代理以控制对这个对象的访问。)
在实际的软件开发中,我们经常面临着对一个对象进行访问控制的问题,由于跨越网络或安全方面等原因不能直接或不需要直接被访问,直接访问的代价会给系统带来不必要的复杂性。
如何在客户端程序与目标对象之间增加一层中间层,通过它来代替目标对象来完成客户程序对目标程序对象的各种操作要求,如此客户程序就可以透明的与目标对象进行交互?这是就需要用到代理模式。
引入的对新对象来实现对真实对象的操作或者是将新的对象作为真实对象的一个替身,这种实现机制即为代理模式。
通过票务中心买火车票,我们知道票务中心并不卖票,只有火车站才真正卖票,票务中心只是代理,票务中心卖的票其实是到火车站买的。
在这个例子中,你就是客户,票务中心就是代理角色,火车站就是具体主体角色,卖票称为抽象主题角色。
抽象主题角色:
1 public interface BuyTicket { 2 public void showTicket(); 3 }
具体主题角色:
1 public class Train implements BuyTicket { 2 3 @Override 4 public void showTicket() { 5 System.out.println("一张火车票"); 6 } 7 8 }
代理角色:
1 public class TicketCenter implements BuyTicket { 2 private BuyTicket ticket; //代理中心需要访问购票中心进行购票 并无出票的功能 也可以是火车站定义Train 3 public TicketCenter(BuyTicket ticket) { 4 this.ticket = ticket;//实例化,需要为自己所设的购票变量绑定实际的购票系统 5 } 6 @Override 7 public void showTicket() { 8 ticket.showTicket();//可以向用户显示的购到的票 9 } 10 /* 11 * 在购票中心的购票功能上封装出属于代理系统的购票函数 12 */ 13 public void buy(){ 14 System.out.println("通过代理购得:");//表明构到票是通过代购系统 15 showTicket();// 16 } 17 18 }
客户测试类:
1 public class ProxyPattern { 2 3 public static void main(String[] args) { 4 BuyTicket x = new Train();//实例化一个购票系统 5 TicketCenter y = new TicketCenter(x); //y代理中心绑定着x购票系统 6 y.buy();//通过代理系统的购票函数购票 7 } 8 9 }