第七篇 调整类间关系 第二十三章 - 门面模式
我们再观察一下前文提到的中介者 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();
}
}
浙公网安备 33010602011771号