1. 认识外观模式
1. 定义
为子系统中的一组接口提供一个统一的界面,外观模式提供了一个更高层的接口,这个接口使得子系统更加容易使用。
2. 组成
子系统功能模块:多个小的功能模块,真正实现功能的地方
Facade:外观模式类,用于将子系统中的功能模块组装成一个客户程序所需要的功能,提供给客户程序调用
3. 参考代码实现
//子系统中的功能模块public class ModuleA { public void operA(){ System.out.println("正在执行A模块中的operA方法"); }}public class ModuleB { public void operB(){ System.out.println("正在执行B模块中的operB方法"); }}/** * @ClassName:Facade * @Description:外观模式类, * 在该类中调用子系统中每个模块中的功能,组合构成应用程序中所需要的功能 */public class Facade { public void test() { ModuleA a=new ModuleA(); a.operA(); ModuleB b=new ModuleB(); b.operB(); }}/** * @ClassName:Client * @Description:客户程序 */public class Client { public static void main(String[] args) { //使用外观模式就不需要和子系统中的需要每个功能模块交互,只需要与Facade类交互即可// ModuleA a=new ModuleA();// a.operA();// ModuleB b=new ModuleB();// b.operB(); new Facade().test(); }}
2. 理解外观模式
1. 作用:外观模式的目的不是给子系统添加额外的功能接口,而是为了减少外部程序与子系统中的各个功能模块之间的交互,松散耦合,使外部程序能够更加简单的使用子系统。
2. 可以将外观模式与工厂模式结合使用,以获取更好的扩展性和维护性,并降低程序整体的耦合性
//子系统的功能模块不变,如上面的代码所示/** * @ClassName:FacadeApi * @Description:在该类中定义客户程序所需要的功能接口 */public interface FacadeApi { public void test();}/** * @ClassName:Facade * @Description:外观模式类,实现FacadeApi接口 * 在该类中调用子系统中每个模块中的功能,组合构成应用程序中所需要的功能 */public class Facade implements FacadeApi{ public void test() { ModuleA a=new ModuleA(); a.operA(); ModuleB b=new ModuleB(); b.operB(); }}//工厂类public class FacadeFactory { public static FacadeApi createFacade(){ return new Facade(); }}/** * @ClassName:Client * @Description:客户程序 */public class Client { public static void main(String[] args) { //结合工厂模式 FacadeApi fac=FacadeFactory.createFacade(); fac.test(); }}
3. 优缺点:
- 降低应用程序之间的耦合性
- 简单易用,更好的划分了程序结构之间的层次
- 过多的或不合理的外观模式类容易使人迷惑,不便于维护
4. 本质:封装应用程序间的交互,简化调用