一、基本介绍
- 外观模式(Facade),也叫“过程模式,外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
- 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。
二、代码实现
(1)创建多种对象
public class DrinkMachine {
private static DrinkMachine instance = new DrinkMachine();
public static DrinkMachine getInstance() {
return instance;
}
public void on() {
System.out.println(" 打开饮水机 ");
}
public void off() {
System.out.println(" 关闭饮水机 ");
}
}
public class Computer {
private static Computer instance = new Computer();
public static Computer getInstance() {
return instance;
}
public void on() {
System.out.println(" 打开电脑 ");
}
public void off() {
System.out.println(" 关闭电脑 ");
}
}
public class People {
private static People instance = new People();
public static People getInstance() {
return instance;
}
public void goWork() {
System.out.println(" 上班 ");
}
public void work() {
System.out.println(" 开始工作 ");
}
public void drink() {
System.out.println(" 喝水休息 ");
}
public void knockOff() {
System.out.println(" 下班回家 ");
}
}
(2)创建外观类
public class WorkFacade {
private People people;
private DrinkMachine drinkMachine;
private Computer computer;
public WorkFacade() {
super();
this.people = People.getInstance();
this.drinkMachine = DrinkMachine.getInstance();
this.computer = Computer.getInstance();
}
public void ready() {
people.goWork();
computer.on();
drinkMachine.on();
}
public void work() {
people.work();
}
public void rest() {
people.drink();
}
public void end() {
computer.off();
drinkMachine.off();
people.knockOff();
}
}
(3)测试
public class Client {
public static void main(String[] args) {
WorkFacade workFacade = new WorkFacade();
workFacade.ready();
workFacade.work();
workFacade.rest();
workFacade.end();
}
}
三、UML类图
四、外观模式小结
- 外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性。
- 外观模式对客户端与子系统的耦合关系,让子系统内部的模块更易维护和扩展。
- 通过合理的使用外观模式,可以帮我们更好的划分访问的层次。
- 当系统需要进行分层设计时,可以考虑使用外观模式。
- 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个外观类,来提供遗留系统的比较清晰简单的接口,让新系统与外观类交互,提高复用性。
- 不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好,要以让系统有层次,利于维护为目的。