一种为多个复杂的子类提供一个一致的接口而使这些子类更容易被访问的模式
这样大大降低了复杂度,提高了可维护性
迪米特法则的典型应用
降低子类与客户端之间的耦合度
对客户屏蔽了子类组件,让子系统使用起来更容易
降低了大型软件系统中的编译依赖性
不能很好限制客户使用子类
增加新的子类会更改外观类,违背了开闭原则
外观角色:为多个子系统对外提供一个共同的接口
子系统角色:实现系统的部分功能,客户可以通过外观角色访问它
客户角色:通过外观角色访问子系统的功能
1、提供子系统和外观角色
package com.xjion.facade; public interface FacadeMethod { void method(); } package com.xjion.facade; /** * 外观角色 */ public class Facade { private SubSystem1 subSystem1 = new SubSystem1(); private SubSystem2 subSystem2 = new SubSystem2(); private SubSystem3 subSystem3 = new SubSystem3(); public void method() { subSystem1.method(); subSystem2.method(); subSystem3.method(); } } /** * 子系统角色3个 */ class SubSystem1 implements FacadeMethod{ @Override public void method() { System.out.println("one!!!"); } } class SubSystem2 implements FacadeMethod{ @Override public void method() { System.out.println("two!!!"); } } class SubSystem3 implements FacadeMethod{ @Override public void method() { System.out.println("three!!!"); } }2、测试
package com.xjion.facade; public class Test { public static void main(String[] args) { Facade facade = new Facade(); facade.method(); } }1、提供特产接口
package com.xjion.specialty; public interface Product { void product(); }2、外观角色及几种特产
package com.xjion.specialty; /** * 特产的外观角色 */ public class SpecialtyFacade { private Product liqueur; private Product orange; private Product rabbit; public SpecialtyFacade() { liqueur = new Wuliangye(); orange = new BooldOrange(); rabbit = new RabbitHead(); } public void Product() { liqueur.product(); orange.product(); rabbit.product(); } } /** * 3个具体特产 */ class Wuliangye implements Product{ @Override public void product() { System.out.println("五粮液"); } } class BooldOrange implements Product{ @Override public void product() { System.out.println("血橙"); } } class RabbitHead implements Product{ @Override public void product() { System.out.println("兔头"); } }3、客户端使用
package com.xjion.specialty; public class Test { public static void main(String[] args) { SpecialtyFacade facade = new SpecialtyFacade(); facade.Product(); } }1、当一个系统的子系统过多时,外观模式可以为系统设计一个简单的接口供外界访问
2、对分层结构系统构建时,视同外观模式定义子系统每层的入口可以简化他们之间的依赖关系
3、当客户端与子系统存在很大联系时,外观模式可以将其分离,提高独立性和可移植性
