例如 你到政府部门去办事情,你需要到部门1办事情,然后再去部门2去办事情,后面有了一站式窗口之后,你只需要把表交给一站式窗口。一站式窗口在去部门1和部门2去办事情,客户不用和模块a和b打交道
案例2:
客户要自己组装电脑,客户需要自己去买cpu 去买电源 去买风扇灯,然后把电脑装起来,相当的麻烦
客户其实只要把电脑需要的配置告诉给电脑装修公司,由装电脑公司去把电脑装好
我们来看一个简单的外观模式的案例:
package cn.javass.dp.facade.example2; /** * A模块的接口 */ public interface AModuleApi { /** * 示意方法,A模块对外的一个功能方法 */ public void testA(); }
package cn.javass.dp.facade.example2; public class AModuleImpl implements AModuleApi{ public void testA() { System.out.println("现在在A模块里面操作testA方法"); } }
package cn.javass.dp.facade.example2; public interface BModuleApi { public void testB(); }、
package cn.javass.dp.facade.example2; public class BModuleImpl implements BModuleApi{ public void testB() { System.out.println("现在在B模块里面操作testB方法"); } }
package cn.javass.dp.facade.example2; public interface CModuleApi { public void testC(); }
package cn.javass.dp.facade.example2; public class CModuleImpl implements CModuleApi{ public void testC() { System.out.println("现在在C模块里面操作testC方法"); } }
package cn.javass.dp.facade.example2; /** * 外观对象 */ public class Facade { /** * 示意方法,满足客户需要的功能 */ public void test(){ //在内部实现的时候,可能会调用到内部的多个模块 AModuleApi a = new AModuleImpl(); a.testA(); BModuleApi b = new BModuleImpl(); b.testB(); CModuleApi c = new CModuleImpl(); c.testC(); } }
package cn.javass.dp.facade.example2; public class Client { public static void main(String[] args) { // //不用Facade,需要自己跟多个模块交互 // AModuleApi a = new AModuleImpl(); // a.testA(); // BModuleApi b = new BModuleImpl(); // b.testB(); // CModuleApi c = new CModuleImpl(); // c.testC(); // // System.out.println("使用Facade----------------------〉"); //使用了Facade new Facade().test(); } }
所谓的设计模式的本质就是有了接口,有了接口的具体实现类,然后才有设计模式,例如简单工厂模式,有了业务接口,有课业务接口的具体实现类,然后才引入工厂模式,工厂模式能够依据客户的参数需求,选择不同的具体现实类。
外观模式本质上也是一样的,通过外观模式来实现用户的需求
注意点:facade需要知道系统内部的模块a,模块b,facade屏蔽了系统内部和客户端的关系,当系统内部的模块功能发送改变的时候,客户端是不知道的,例如装修电脑,转机公司要到去买电源,装机公司需要去买cpu,客户不直接和cpu公司这些打交道