设计模式 - 外观模式
场景
小张搬家了,新的房间都是智能化,但是每个设备都是独立的,小张每次回家之前需要打开app分别打开每个设备,例如小张回家后的基本操作是开门,打开电灯,把书从书架拿下来放到桌子上然后自动翻到昨日读到页码。这三个三个操作,小张需要分别操作三次,作为程序员小张觉得这个太不自动化了。他想把这三个变成一件事情而不是三件事。
小张想自己应该封装一下,把三个步骤变成一个操作。
外观模式
外观模式:提供一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
uml类图
book类
package xuelongjiang.designpartten.facade;
/**
* @Author xuelongjiang
*/
public class Book {
public void watch(){
System.out.println("从书架拿书");
}
public void over(){
System.out.println("把书放回书架");
}
}
Light类
package xuelongjiang.designpartten.facade;
/**
* @Author xuelongjiang
*/
public class Light {
public void on(){
System.out.println("开灯");
}
public void off(){
System.out.println("关灯");
}
}
door类
package xuelongjiang.designpartten.facade;
/**
* @Author xuelongjiang
*/
public class Door {
public void on(){
System.out.println("开门");
}
public void off(){
System.out.println("关门");
}
}
外观类
package xuelongjiang.designpartten.facade;
/**
*
* 外观模式: 提供子系统一个简化的接口
*
*
* @Author xuelongjiang
*/
public class FacadePattern {
private Book book;
private Light light;
private Door door;
public FacadePattern(Book book, Light light, Door door) {
this.book = book;
this.light = light;
this.door = door;
}
public void goHome(){
door.on();
light.on();
book.watch();
}
public void goWork(){
book.over();
light.off();
door.off();
}
}
测试类
package xuelongjiang.designpartten.facade;
/**
* @Author xuelongjiang
*/
public class FacadeTest {
public static void main(String[] args) {
Book book = new Book();
Light light = new Light();
Door door = new Door();
FacadePattern facadePattern = new FacadePattern(book,light,door);
facadePattern.goHome();
System.out.println("-------------");
facadePattern.goWork();
}
}
要点
- 当需要简化并统一一个很大的接口或者一群很复杂的接口时,使用外观
- 外观将客户从一个复杂的子系统中解耦(FacadeTest就是客户类)
- 实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行
- 你可以为一个子系统实现一个以上的外观