java设计模式---外观模式(facade pattern)
2018-03-19 09:30
676 查看
java设计模式—外观模式(facade pattern)
1. 定义外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义一个高层接口,让子系统更容易使用。
2. UML图
外观模式又称为门面模式,它是一种对象结构型模式。外观模式是迪米特法则的一种具体实现,通过引入一个新的外观角色可以降低原有系统的复杂度,同时降低客户类与子系统的耦合度。
从上图可以看到外观模式包含两个角色:
(1) Facade(外观角色):在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。
(2) SubSystem(子系统角色):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。
3. 简单的代码实现
//定义几个子系统模块 class SubSystemA { public void MethodA() { //业务实现代码 } } class SubSystemB { public void MethodB() { //业务实现代码 } } class SubSystemC { public void MethodC() { //业务实现代码 } } //定义外观类,其内部引用了三个子系统模块 class Facade { private SubSystemA obj1 = new SubSystemA(); private SubSystemB obj2 = new SubSystemB(); private SubSystemC obj3 = new SubSystemC(); public void Method() { obj1.MethodA(); obj2.MethodB(); obj3.MethodC(); } }
4. 具体的示例
这里我们用电脑来简单的举例,电脑内部都是有主板、CPU、内存、硬盘等主要硬件组成了,电脑主机对外来说就是一个上层接口,一个外观,隐藏了内部的几大硬件,具体的代码示例如下:
//定义内存接口 public interface Ram { String getContent(); } //定义一个具体的内存 public class ADataRam implements Ram { @Override public String getContent() { System.out.println("AData Ram"); return "AData Ram"; } } //定义硬盘接口 public interface Rom { String getContent(); } //定义一个具体品牌的硬盘 public class XijieRom implements Rom{ @Override public String getContent() { System.out.println("Xi Jie Rom"); return "Xi Jie Rom"; } } //定义CPU接口 public interface Cpu { void compute(); } //定义一个具体品牌的CPU public class InterCpu implements Cpu { @Override public void compute() { System.out.println("Inter CPU is running"); } } //定义具体的笔记本 public class XimiNoteBook { private Cpu cpu = new InterCpu(); private Ram ram = new ADataRam(); private Rom rom = new XijieRom(); public void start() { ram.getContent(); rom.getContent(); cpu.compute(); } } //测试类 public class FacadeTest { public static void main(String[] args) { XimiNoteBook noteBook = new XimiNoteBook(); noteBook.start(); } }
执行上面的测试类结果为:
AData Ram Xi Jie Rom Inter CPU is running
5. 优缺点
5.1 优点
(1)对客户端隐藏了子系统的细节,减少客户端对于子系统的耦合,做到拥抱变化
(2)外观类对子系统的接口封装,使得子系统更易于使用
5.2 缺点
(1)外观类接口的膨胀,由于子系统的接口都由外观类统一对外暴露,使得外观类的Api接口增多
(2)外观类没有遵循开闭原则,当业务发生变更时,可能需要直接更改外观类.
6. 使用场景
(1)为一个复杂子系统提供一个简单接口,子系统往往因为不断演化而变得越来越复杂,甚至可能被替换,facade模式可以提供一个简单统一的接口,,对外隐藏子系统的具体实现,隔离变化。
(2)当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让他们仅通过facade接口通信,从而简化了他们之间的依赖关系。
4000
相关文章推荐
- Java设计模式——门面(外观)模式(Facade Pattern)
- 【JAVA设计模式】外观模式(Facade Pattern)
- java设计模式——外观模式(Facade Pattern)
- 设计模式学习笔记---外观模式Facade pattern(Java版)
- Java设计模式:外观模式(Facade Pattern)与最少知识原则
- Java设计模式之--外观模式(facade pattern)
- 【JAVA设计模式】外观模式(Facade Pattern)
- java_设计模式_外观模式_Facade Pattern(2016-08-09)
- java 23种常用设计模式之外观模式(Facade)
- 设计模式笔记10:外观模式(Facade Pattern)
- 设计模式(十五)-外观模式(Facade Pattern)——推卸责任
- 设计模式之四:外观模式(Facade Pattern)
- c++设计模式:外观模式(Facade Pattern)
- Java之外观模式(Facade Pattern)
- 设计模式——外观模式(FacadePattern)
- 我所理解的设计模式(C++实现)——外观模式(Facade Pattern)
- JAVA设计模式(DESIGN PATTERNS IN JAVA)读书摘要 第1部分接口型模式——第4章 外观(Facade)模式
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
- JAVA设计模式(22) —外观(Facade)模式
- 设计模式-外观模式(Facade Pattern)