结构型模式之外观模式
一.定义
外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。
二、模式结构成员构成
• Facade: 外观角色
• SubSystem:子系统角色
三.代码示例
View Code
1 /** 2 * SubSystem 3 * 内部子系统角色 4 */ 5 public class CPU { 6 public void freeze() { 7 } 8 9 public void jump(long position) { 10 } 11 12 public void execute() { 13 } 14 } 15 16 /** 17 * SubSystem 18 * 内部子系统 19 */ 20 public class Memory { 21 public void load(long position, byte[] data) { 22 23 } 24 } 25 26 /** 27 * SubSystem 28 * 内部子系统角色 29 */ 30 public class HardDrive { 31 public byte[] read(long lba, int size) { 32 return null; 33 } 34 } 35 36 /** 37 * Facade 38 * 外观角色角色 39 */ 40 public class Computer { 41 42 //统一管理内部子系统 43 private CPU cpu = new CPU(); 44 private HardDrive hardDrive = new HardDrive(); 45 private Memory memory = new Memory(); 46 47 long BOOT_ADDRESS; 48 long BOOT_SECTOR; 49 int SECTOR_SIZE; 50 51 public void startComputer() { 52 cpu.freeze(); 53 memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE)); 54 cpu.jump(BOOT_ADDRESS); 55 cpu.execute(); 56 } 57 } 58 59 /** 60 * client 61 */ 62 public class Client { 63 public static void main(String[] args) { 64 Computer facade = new Computer(); 65 facade.startComputer(); 66 } 67 }
四.优点和缺点分析
优点:
>对客户屏蔽了内部子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。
>实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。
>只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
缺点:
>在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
五.应用场景
>当要为一个复杂子系统提供一个简单接口时可以使用外观模式。该接口可以满足大多数用户的需求,而且用户也可以越过外观类直接访问子系统。
>通过引入外观模式,将客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。
>在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。
你投入得越多,就能得到越多得价值