第七篇 调整类间关系 第二十三章 - 门面模式

  我们再观察一下前文提到的中介者 M。

// M(中介者)
public class M {

  // 采集数据
  public static void data() {
    A.data();
    B.data();
    C.data();
  }

}

  M 隐藏了 A、B、C 等承担具体职责的类,对外提供了一个简单易用的“采集数据”方法。
  若我们将 A、B、C、M 看作一个子系统 S,则可将 M 视为这个子系统的边界(或称门面)。其它子系统可以通过这道边界访问 S,而不必了解 S 的内部细节(A、B、C等)。
  系统结构如下图所示。
  
 “树立边界”正是门面模式的设计思路,它在子系统之间建立了松散的耦合关系和简单易用的交互接口。
  再看个具体的例子,我们模拟蚂蚁群体的分工与协作机制,体会门面模式的作用。

// 抽象蚂蚁
public abstract class Ant {

  // 工作
  public abstract void work();

}

// 蚁后
public class QueenAnt extends Ant {

  @Override
  public void work() {
    // 产卵
  }

}

// 兵蚁
public class SoldierAnt extends Ant {

  @Override
  public void work() {
    // 战斗
  }

}

// 工蚁
public class WorkerAnt extends Ant {

  @Override
  public void work() {
    // 搬运
  }

}

// 门面
public class AntFacade {

  Ant obj1 = new QueenAnt();
  Ant obj2 = new SoldierAnt();
  Ant obj3 = new WorkerAnt();

  /** 供其它子系统使用的简易方法 **/

  // 产卵
  public void layEggs() {
    obj1.work();
  }

  // 战斗
  public void fight() {
    obj2.work();
  }

  // 搬运
  public void carry() {
    obj3.work();
  }

}

// 测试类
public class Test {

  // 其它子系统只与“门面”交互。
  // 其它子系统只知有蚁,未识蚁有后、兵、工之别。
  public void test() {
    AntFacade obj = new AntFacade();
    obj.layEggs();
    obj.fight();
    obj.carry();
  }

}
posted on 2025-03-28 22:46  星辰河岳  阅读(35)  评论(0)    收藏  举报