• 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();
     } 
    }

    如果我想买火车票,就设计一个售火车票的具体类,实现售票功能,然后将这个具体实现传给代理类,让他去做。

    总结:这个代理类就是具体对象的替身,用他来控制对这个体对象的访问,用他来控制交给谁处理。这个代理类要持有具体对象的引用。

     结合上面售票讲解,映射到代码层面来。

     代理类:老板开售票点,打开门做生意,就是代理类

     卖票接口:老板开店就是卖票的,不干别的(要是还有别的也可以),那么就有售票的功能。

     售票引用:老板开店了需要向具体的系统注册了才能卖相应的票种,这些系统都是有售票功能的,只要我注册的才能买,没注册的不能(我可以帮你买我卖的票种,不是的我买不了)。

    通过上面生活中的例子讲解,希望对你理解代理模式有所帮助,这些也是本人的愚见,若有错误之处,请指出,共同学习。

  • 相关阅读:
    Unity场景加载完成回调
    UnityShader 一些算法总结
    Unity ugui 的 Button 组件的 点击、按下、抬起等按钮事件(eventTrigger)
    Unity 鼠标拖拽旋转物体
    JVM
    JVM
    JVM
    JVM
    JVM
    JVM
  • 原文地址:https://www.cnblogs.com/hjy9420/p/5009332.html
Copyright © 2020-2023  润新知