1. 外观模式概述
外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
它向现有的系统添加一个接口,来隐藏系统的复杂性。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
(1) 适用情况
用于简化系统复杂的内部结构,只需要由一个外观类对外提供接口即可。
(2) 优点
可以降低客户端和服务端之间的依赖。
(3) 缺点
修改比较麻烦,不符合开闭原则
2. 外观模式实例
我们还是用造车来举例,之前我们使用过工厂模式,这里适用外观模式来造车。
(1) 声明汽车接口
public interface Car {
void declare();
}
(2) 实现具体的汽车类
public class Benz implements Car {
@Override
public void declare() {
System.out.println("我是一辆奔驰。");
}
}
public class BMW implements Car {
@Override
public void declare() {
System.out.println("我是一辆宝马。");
}
}
public class Audi implements Car {
@Override
public void declare() {
System.out.println("我是一辆奥迪。");
}
}
(3) 实现外观类
public class CarBuilder {
private Car benz;
private Car bmw;
private Car audi;
public CarBuilder() {
this.benz = new Benz();
this.bmw = new BMW();
this.audi = new Audi();
}
public void buildBenz() {
benz.declare();
}
public void buildBMW() {
bmw.declare();
}
public void buildAudi() {
audi.declare();
}
}
(4) 使用外观类来造车
public class FacadeDemo {
public static void main(String[] args) {
CarBuilder carBuilder = new CarBuilder();
carBuilder.buildBenz();
carBuilder.buildBMW();
carBuilder.buildAudi();
}
}
运行结果:
3. 一些思考
对比工厂模式和外观模式:
工厂模式里,我们创建了一个汽车工厂,由汽车工厂提供方法,汽车工厂会根据这个方法的传参来判断应该生产什么汽车。
而在外观模式中,我们创建了一个外观类,在外观类中组合了各品牌汽车的实例,然后对外提供不同的方法,用于创建各个品牌的汽车。
如果在外观模式的CarBuilder中只实现一个buildCar方法,然后根据它的入参来生产不同品牌的汽车的话,感觉就与工厂模式更相似了。
实际上,它们最大的区别是,工厂模式是用来创建车的实例的,每次调用其接口都会新建一个新的实例,而这个实例具体用来干什么,工厂模式并不关心。
而外观模式是用来调用车的接口的,在初始化外观类的时候,已经创建好了各品牌车的实例,每次调用其接口不会创建新的实例,只是利用已经创建好的实例,来调用具体的方法。