设计模式(9)---外观模式
外观模式 Facade (结构型模式)
1.概述
外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式是迪米特法则的一种具体实现,通过引入一个新的外观角色可以降低原有系统的复杂度,同时降低客户类与子系统的耦合度。
例如:你请朋友吃饭,你可能需要买菜,洗菜,切菜,做菜等等这些模块,现在你去餐馆去吃,这些步骤他们帮你搞定,餐馆的服务就相当于一个外观类。
2.结构图
3.代码
现在需要读入一个文件,对文件的数据加密后,输出加密后的文件
1 public class FileReader { 2 3 public void read(){ 4 System.out.println("读文件"); 5 } 6 7 }
1 public class FileProcess { 2 3 public void process(){ 4 System.out.println("对文件加密"); 5 } 6 7 }
1 public class FileWriter { 2 3 public void writer(){ 4 System.out.println("写文件"); 5 } 6 7 }
1 /* 2 * 外观类 3 */ 4 public class Facade { 5 6 private FileReader fileReader ; 7 private FileProcess fileProcess ; 8 private FileWriter fileWriter ; 9 10 public Facade() { 11 fileReader = new FileReader() ; 12 fileProcess = new FileProcess(); 13 fileWriter = new FileWriter() ; 14 } 15 16 public void FileEncrypt(){ 17 fileReader.read(); 18 fileProcess.process(); 19 fileWriter.writer(); 20 } 21 22 }
1 public class Test { 2 3 public static void main(String[] args) { 4 Facade facade = new Facade(); 5 facade.FileEncrypt(); 6 } 7 8 }
假如不使用外观类的话,客户类需要3个子系统的实例化对象,使得类与类之间的耦合性增加,引入外观模式则降低了耦合性,如果需要增加新的子系统或者移除子系统都非常方便,客户类无须进行修改(或者极少的修改),只需要在外观类中增加或移除对子系统的引用即可。
绝大多数B/S系统都有一个首页或者导航页面,大部分C/S系统都提供了菜单或者工具栏,在这里,首页和导航页面就是B/S系统的外观角色,而菜单和工具栏就是C/S系统的外观角色,通过它们用户可以快速访问子系统,降低了系统的复杂程度。所有涉及到与多个业务对象交互的场景都可以考虑使用外观模式进行重构。