外观模式
基础介绍
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
涉及两个角色:
1.门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。
2.子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。
实例:汽车的启动与停车
需求
启动车辆,打开车门,启动发动机,踩油门
停车,踩刹车,关闭发动机,关闭车门
代码实现
第一步:创建子系统角色(车门类)
//车门
public class CarDoor {
private static CarDoor instance = new CarDoor();
public static CarDoor getInstance(){
return instance;
}
public void open(){
System.out.println("打开车门");
}
public void close(){
System.out.println("关闭车门");
}
}
第二步:创建子系统角色(发动机类)
//发动机
public class Engine {
private static Engine instance = new Engine();
public static Engine getInstance(){
return instance;
}
public void start(){
System.out.println("启动发动机");
}
public void stop(){
System.out.println("关闭发动机");
}
}
第三步:创建子系统角色(油门类)
//油门
public class Accelerator {
private static Accelerator instance = new Accelerator();
public static Accelerator getInstance(){
return instance;
}
public void run(){
System.out.println("踩油门");
}
}
第四步:创建子系统角色(刹车类)
public class Breaking {
private static Breaking instance = new Breaking();
public static Breaking getInstance(){
return instance;
}
public void stop(){
System.out.println("踩刹车");
}
}
第五步:创建门面角色
public class Facade {
private CarDoor carDoor;
private Engine engine;
private Accelerator accelerator;
private Breaking breaking;
public Facade() {
this.carDoor = CarDoor.getInstance();
this.engine = Engine.getInstance();
this.accelerator = Accelerator.getInstance();
this.breaking = Breaking.getInstance();
}
//启动车辆
public void start(){
carDoor.open();
engine.start();
accelerator.run();
}
//停辆
public void stop(){
breaking.stop();
engine.stop();
carDoor.close();
}
}
测试
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.start();
System.out.println("====================");
facade.stop();
}
}
运行结果
总结
外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性。