前言
俗话说得好,随着人类的进步,社会的发展(土土的小学生用语),家庭影院已经进入普通家庭。那么如何构建一个集中管理的家庭影院软件系统呢?注意家庭影院需要做很多有趣的事情哦,比如内含DVD播放器,投影仪,自动屏幕,环绕立体声等。。。
当当当,外观模式闪亮登场(QAQ)。。。
概述
定义
外观模式(Facade Pattern)提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
外观模式允许我们让客户和子系统之间避免紧耦合,而且遵循“最少知识”原则
”最少知识“原则:只和你的密友谈话。也就是说,当你正在设计一个系统,不管是任何对象,你都要注意它所交互的类有哪些,并注意它和这些类是如何交互的。
类图
Facade:外观角色
设计模式的实现
背景
背景就是前言中提到的,实现家庭影院。现在,我需要实现对投影仪,空调,屏幕和灯的控制。这里我们只实现对投影仪和屏幕的控制。
代码实现
package Facade;
/**
* 子系统——投影仪
* Created by ChongLou on 2017/8/20.
*/
public class Projector {
public void on() {
System.out.println("打开了投影仪。。。");
}
public void off() {
System.out.println("关闭了投影仪");
}
}
package Facade;
/**
* 子系统——屏幕
* Created by ChongLou on 2017/8/20.
*/
public class Screen {
public void on() {
System.out.println("打开了屏幕");
}
public void off() {
System.out.println("关闭了屏幕");
}
}
package Facade;
/**
* 家庭影院外观
* Created by ChongLou on 2017/8/20.
*/
public class HomeTheaterFacade {
Projector projector;
Screen screen;
public HomeTheaterFacade(Projector projector, Screen screen) {
this.projector = projector;
this.screen = screen;
}
public void on(){
projector.on();
screen.on();
}
public void off(){
screen.on();
projector.on();
}
}
package Facade;
/**
* 客户端
* Created by ChongLou on 2017/8/20.
*/
public class Client {
public static void main(String[] args) {
Projector projector = new Projector();
Screen screen = new Screen();
HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade(projector, screen);
homeTheaterFacade.on();
System.out.println("家庭影院已经打开");
homeTheaterFacade.off();
System.out.println("家庭影院已经关闭");
}
}
运行结果
总结
- 外观将客户从一个复杂的子系统中解耦。
- 实现一个外观,需要将子系统组合禁外观中,然后将工作委托给子系统执行。
- 适配器将一个对象包装起来以改变其接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象“包装”起来以简化其接口。