外观模式是软件工程中常用的一种软件设计模式。它为子系统中的一组接口提供一个统一的高层接口并向客户端暴露,隐藏了系统的复杂性,这一接口使得子系统更加容易使用。
它主要由两部分组成,一部分是子系统(包括接口,实现类,等等),一部分是外观接口和实现类,外观接口负责提供客户端定制的服务,外观实现则负责组合子系统中的各个类和接口完成这些服务,外观接口则是提供给客户端使用的,这样就解除了客户端与子系统的依赖,而让客户端只依赖于外观接口,这是一个优秀的解耦实践。
例如电脑开机需要借助cpu、disk、memory等按照先后顺序执行相应的方法才能正常启动,而我们用户却不需要关心这些,只需要去按一下开机键即可,这里面便有外观模式的思想。我们经常说的三层架构,其实业务层也是外观模式的应用,通过添加业务层,实现了表现层和数据访问层的解耦,表现层只需要去业务层调用接口即可而不需要关心数据是如何获取和存储的。下面的简单的demo。
子系统代码
package com.example.demo.facade; public interface Cpu { void start(); }
package com.example.demo.facade; public interface Disk { void start(); }
package com.example.demo.facade; public interface Memery { void start(); }
package com.example.demo.facade; public class IntelCpu implements Cpu{ @Override public void start() { System.out.println("IntelCpu启动"); } }
package com.example.demo.facade; public class CaihongDisk implements Disk{ @Override public void start() { System.out.println("CaihongDisk启动"); } }
package com.example.demo.facade; public class JinshidunMemory implements Memery{ @Override public void start() { System.out.println("JinshidunMemory启动"); } }
外观接口
package com.example.demo.facade; public interface Facade { void computerStart(); }
外观实现
package com.example.demo.facade; public class AcerComputer implements Facade{ private Cpu cpu; private Disk disk; private Memery memery; public AcerComputer() { this.cpu = new IntelCpu(); this.disk = new CaihongDisk(); this.memery = new JinshidunMemory(); } @Override public void computerStart() { cpu.start(); disk.start(); memery.start(); } }
测试client
package com.example.demo.facade; public class Client { public static void main(String[] args) { Facade f = new AcerComputer(); f.computerStart(); } }
结果就不贴了,可以看出通过适用外观模式,系统实现了子系统与客户端之间的松耦合关系,客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。
外观模式的适用情况:
(1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
(2) 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
(3) 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。