设计模式:外观模式(门面模式)
外观模式也叫门面模式, 它为子系统提供统一入口,封装系统复杂性。如同医院看病,病人需要与挂号,门诊,划价,化验,收费,取药等部门打交道
如同一个子系统客户端和另一个子系统各个类打交道一样,相互耦合处理复杂,如果引入门面模式,在医院增加一个接待员,由接待员复制与上面各个
部门打交道,那么对于病人这个客户端来说就容易很多。
门面模式主要就两个角色。
门面角色:客户端调用该角色方法。该角色包好各子系统的功能。
子系统角色:完成子系統各功能
例子:模拟注册公司流程
1:未使用门面模式时,流程图如下
2.使用了门面模式后(增加门面对象)
interface GongShang { boolean checkName(); } /** * 模擬工商局 */ public class BeijinGongShang implements GongShang{ @Override public boolean checkName() { System.out.println("北京工商局检查"); return false; } }
interface ShuiWu { boolean checkCertificate(); } /** * 模拟税务局 */ public class BeijinShuiWu implements ShuiWu { @Override public boolean checkCertificate() { System.out.println("北京稅務局"); return false; } }
interface Zhijian{ boolean checkType(); } public class BeijinZhijian implements Zhijian{ @Override public boolean checkType() { System.out.println("北京質監局"); return false; } }
/** * 办理注册公司流程的门面对象 * */ public class RegisterFacade { public void register(){ GongShang a = new BeijinGongShang(); a.checkName(); Zhijian b = new BeijinZhijian(); b.checkType(); ShuiWu c = new BeijinShuiWu(); c.checkCertificate(); } }
public class Client { public static void main(String[] args) { //使用门面模式只需要调用门面角色的方法 new RegisterFacade().register(); } }
从上面的实例来看,有了这个門面类,也就是RegeisterFacader类,用户就不用亲自去调用子系统中类了,不需要知道系统内部的实现细节,甚至都不用知道系统内部的构成。
客户端只需要跟门面类交互就可以了。