门面模式(外观Facade模式)
2015-08-16 08:05
288 查看
外观模式UML图
外观模式UML
定义
外观模式(也成为门面模式)要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。它提供一个高层次的接口,使得子系统更易于使用类型:结构型模式
使用场景
在真实的应用系统中,一个子系统可能由很多类组成。子系统的客户为了它们的需要,需要和子系统中的一些类进行交互。客户和子系统的类进行直接的交互会导 致客户端对象和子系统之间高度耦合。
代码举例说明
public class Facede { //各种子系统的操作 private Light light; private Door door; private Window window; public void goHome(){ light.on(); door.open(); window.open(); } public void leftHome(){ light.off(); door.close(); window.close(); } }
通用代码实现
[java] view
plaincopyprint?
// 子系统01,邮局接收信件的业务
class Subsystem01 {
public void receiveLetters() {
System.out.println("邮局接收用户的信件...");
}
}
[java] view
plaincopyprint?
// 子系统02,邮局检查信件并分类的业务
class Subsystem02 {
public void checkLetters() {
System.out.println("邮局检查用户的信件...");
}
}
[java] view
plaincopyprint?
// 子系统03,邮局让邮递员送信给收信人
class Subsystem03 {
public void sendToReceiver() {
System.out.println("邮递员送信 ...");
}
}
[java] view
plaincopyprint?
// 子系统04,邮局新推出的赠送贺卡的特殊业务
class Subsystem04 {
public void sendGreetingCard() {
System.out.println("邮局的额外送贺卡服务 ...");
}
}
[java] view
plaincopyprint?
// Facade01 ,只是普通的送信
class Facade01 {
private Subsystem01 subsystem01;
private Subsystem02 subsystem02;
private Subsystem03 subsystem03;
public Facade01() {
this.subsystem01 = new Subsystem01();
this.subsystem02 = new Subsystem02();
this.subsystem03 = new Subsystem03();
}
// 普通的送信,委托给各个必要的子系统
public void commonSendLetters() {
this.subsystem01.receiveLetters();
this.subsystem02.checkLetters();
this.subsystem03.sendToReceiver();
}
}
[java] view
plaincopyprint?
//Facade02 ,增加了送贺卡的业务
class Facade02 {
// 委托 Facade01 进行普通业务的处理
private Facade01 facade01;
private Subsystem04 subsystem04;
public Facade02() {
this.facade01 = new Facade01();
this.subsystem04 = new Subsystem04();
}
// 特殊的送信
public void specialSendLetters() {
this.facade01.commonSendLetters();
// 普通的送信之后再赠送贺卡
this.subsystem04.sendGreetingCard();
}
}
[java] view
plaincopyprint?
// 测试类,即客户寄信
public class Client {
public static void main(String[] args) {
Facade01 facade01 = new Facade01();
facade01.commonSendLetters();
System.out.println();
Facade02 facade02 = new Facade02();
facade02.specialSendLetters();
}
}
运行结果
[java] view
plaincopyprint?
邮局接收用户的信件...
邮局检查用户的信件...
邮递员送信 ...
邮局接收用户的信件...
邮局检查用户的信件...
邮递员送信 ...
邮局的额外送贺卡服务 ...
总结优缺点
优点使用方便,使用外观模式客户端完全不需要知道子系统的实现过程;
降低客户端与子系统的耦合;
缺点
减少了可变性和灵活性;
在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”;
Facade模式与 Mediator模式(中介者)的比较:
在 Facade 模式中,Facade 并不参与 Subsystem 类中的业务逻辑,所有的业务功能实际上全由各个 Subsystem 完成, Facade 只是在客户与 Subsystem 之间存在的一道门,客户只能拿着这道门的钥匙来获得业务功能、服务;而在 Mediator模式中,Mediator类是一个调停者、中介者,它完完全全地负责协调各个 Colleague 同事类之间的信息交互,以此来完成其工作。
相关文章推荐
- wifi定位原理
- 【Howie玩docker】-命令行只显示-bash-4.1#
- 学习Android中的Parcelable接口
- 5.4Iterative statement &6.2Argument passing
- C++二叉搜索树容器set的调用
- 大公司里怎样开发和部署前端代码?
- C#名单:一个简单的实现
- "中国制造2025"+"互联网+",引领制造业发展
- C++键树容器map的调用
- 关注先进制造带来的创新红利
- List的使用方法
- Gulp开发教程(翻译)
- C++栈的调用
- swift 学习笔记二:Closures
- Spring学习笔记-springMVC入门Demo
- C++优先队列的调用
- 美国如何布局战略,对应《中国制造2025》?
- C++基础---位操作符
- 打破外国垄断,看“中国制造”向“中国智造”进发
- C++普通队列容器