23种设计模式 第二部分 结构模式(4) 外观模式
来源:互联网 发布:淘宝货物怎么上架 编辑:程序博客网 时间:2024/06/05 02:47
理解
其实,外观模式采用的是一种简化的思想。如上图看到,适配器是实现适配器的转换,装饰器是给原有接口增加新的功能,而外观模式提供了一个简化接口的方法。
我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。
例子1:一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动和关闭。该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计。
例子1:一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动和关闭。该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计。
外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口,看下类图
实现
首先写出3个类
public class CPU {public void startup(){System.out.println("CPU开始工作");}public void shutdown(){System.out.println("CPU关闭");}}
public class Memory {public void startup(){System.out.println("Memory开始工作");}public void shutdown(){System.out.println("Memory关闭");}}
public class Disk {public void startup(){System.out.println("Disk开始工作");}public void shutdown(){System.out.println("Disk关闭");}}写出包含(关联)3个部件的Computer类
public class Computer {private CPU cpu;private Memory memory;private Disk disk;Computer(){cpu = new CPU();memory = new Memory();disk = new Disk();}public void startup(){System.out.println("开启电脑");cpu.startup();memory.startup();disk.startup();}public void shutdown(){System.out.println("关闭电脑");cpu.shutdown();memory.shutdown();disk.shutdown();}}测试类:
public class User {public static void main(String[] args){Computer computer = new Computer();computer.startup();computer.shutdown();}}输出:
开启电脑CPU开始工作Memory开始工作Disk开始工作关闭电脑CPU关闭Memory关闭Disk关闭
有了Computer类,可以使原有的3个类解耦。如果没有Computer类,他们之间存在严重的依赖,修改其中1个可能对其他类有影响,这样不好。可见使用外观模式(facade,大家不要读错这个单词,如果你是理所当然的读,很有可能读错,需要查查记一下)的优点。
其他的解释和实现
namespace Designpattern.Facade{ class SubsystemA { public string OperationA1() { return "Subsystem A, Method A1\n"; } public string OperationA2() { return "Subsystem A, Method A2\n"; } } class SubsystemB { public string OperationB1() { return "Subsystem B, Method B1\n"; } public string OperationB2() { return "Subsystem B, Method B2\n"; } } class SubsystemC { public string OperationC1() { return "Subsystem C, Method C1\n"; } public string OperationC2() { return "Subsystem C, Method C2\n"; } } public class Facade { private readonly SubsystemA a = new SubsystemA(); private readonly SubsystemB b = new SubsystemB(); private readonly SubsystemC c = new SubsystemC(); public void Operation1() { Console.WriteLine("Operation 1\n" + a.OperationA1() + a.OperationA2() + b.OperationB1()); } public void Operation2() { Console.WriteLine("Operation 2\n" + b.OperationB2() + c.OperationC1() + c.OperationC2()); } }}Java:
/* Complex parts */class CPU { public void freeze() { ... } public void jump(long position) { ... } public void execute() { ... }}class Memory { public void load(long position, byte[] data) { ... }}class HardDrive { public byte[] read(long lba, int size) { ... }}/* Facade */class ComputerFacade { private CPU processor; private Memory ram; private HardDrive hd; public ComputerFacade() { this.processor = new CPU(); this.ram = new Memory(); this.hd = new HardDrive(); } public void start() { processor.freeze(); ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE)); processor.jump(BOOT_ADDRESS); processor.execute(); }}/* Client */class You { public static void main(String[] args) { ComputerFacade computer = new ComputerFacade(); computer.start(); }}
总结
外观模式一般用在:
1、简化一个相对复杂的系统的接口。
2、分层设计,在每一层都需要一个入口点时。
3、系统存在多个子系统,需要尽量降低各个系统之间的通信和相互依赖程度。
优点:
(1)实现了子系统与客户端之间的松耦合关系。
(2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。
(2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。
0 0
- 23种设计模式 第二部分 结构模式(4) 外观模式
- 23种设计模式 第二部分 结构模式(1) 适配器模式
- 23种设计模式 第二部分 结构模式(2) 装饰器模式
- 23种设计模式 第二部分 结构模式(3) 代理模式
- 23种设计模式 第二部分 结构模式(5) 桥接模式
- 23种设计模式 第二部分 结构模式(6)组合模式
- 23种设计模式 第二部分 结构模式(7)享元模式
- 【23种设计模式】结构型模式 > 外观模式
- 23种设计模式3--结构型模式(适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式)
- 23种设计模式--结构型模式(适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式)
- 设计模式 - 结构型模式 - 外观模式
- 【设计模式】- 【结构型模式】外观模式
- 设计模式---结构类型---外观
- 设计模式-结构型-外观
- 23种设计模式(10)_结构型_外观模式(Facade Pattern)
- 23种设计模式之外观模式
- 23种设计模式08---外观模式
- 23种设计模式之外观模式
- poj1260(形如E[j]=opt{D+w(i,j)}的dp)
- Groovy官网
- Swift中关于字符串的相关操作
- 404错误页面处理
- 编译时的编程机制
- 23种设计模式 第二部分 结构模式(4) 外观模式
- VB2012学习
- 第六章 第三节 按钮控件
- Android缓存
- Servlet和Jsp中的Request转发、重定向
- 最长公共子串和最长公共子序列
- java中IO整理
- POJ1256
- HDU 1233--还是畅通工程