设计模式之代理模式

76 阅读1分钟

案例:西门庆追求潘金莲,王婆做代理

先定义一个接口,表示一类女人:

/**
 * @Description: 
 * 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
 */
public interface KindWomen {

  // 抛媚眼
  public void makeEyesWithMan(); 
  
  // ...
  public void happyWithMan();
  
}

两个具体实现类:

/**
 * @Description 潘金莲
 */
public class PanJinLian implements KindWomen {

  @Override
  public void makeEyesWithMan() {
    System.out.println("潘金莲抛媚眼...");
  }

  @Override
  public void happyWithMan() {
    System.out.println("潘金莲在和男人...");
  }

}

/**
 * @Description 王婆,代理类
 */
public class WangPo implements KindWomen {

  private KindWomen kindWomen;
  
  // 默认是潘金莲的代理
  public WangPo() {
    this.kindWomen = new PanJinLian();
  }
  
  // 可以是KindWomen接口的任何一个实现类的代理
  public WangPo(KindWomen kindWomen) {
    this.kindWomen = kindWomen;
  }
  
  @Override
  public void makeEyesWithMan() {
    // 其代理的女人抛媚眼
    this.kindWomen.makeEyesWithMan();
  }

  @Override
  public void happyWithMan() {
    // 其代理的女人和男人..
    this.kindWomen.happyWithMan();
  }

}

西门庆,客户端类:

/**
 * @Description 西门庆
 */
public class XiMenQing {

  public static void main(String[] args) {
    // 把王婆叫出来
    WangPo wangPo = new WangPo();
    
    // 表面看是王婆和西门庆在搞事,实际上是潘金莲
    wangPo.makeEyesWithMan();
    wangPo.happyWithMan();
  }
  
}

扩展起来也比较方便,增加一个实现类:

/**
 * @Description 贾氏
 */
public class JiaShi implements KindWomen {

  @Override
  public void makeEyesWithMan() {
    System.out.println("贾氏抛媚眼...");
  }

  @Override
  public void happyWithMan() {
    System.out.println("贾氏正在...");
  }

}

客户端修改:

public class XiMenQing {

  public static void main(String[] args) {
    
    JiaShi jiaShi = new JiaShi();
    WangPo wangPo = new WangPo(jiaShi);
    
    wangPo.makeEyesWithMan();
    wangPo.happyWithMan();
  }
  
}

总结一下代理模式:利用Java的多态特性,具体实现业务逻辑的是被代理类,代理类给客户端提供调用,代理将具体的业务逻辑交由具体的业务实现类去做。

类图:

本文原书:《您的设计模式》作者:CBF4LIFE