1 外观模式介绍
2 外观模式原理
java
public class SubSystemA {
public void methodA(){
//业务代码
}
}
java
public class SubSystemB {
public void methodB(){
}
}
java
public class SubSystemC {
public void methodC(){
}
}
java
public class Facade {
private SubSystemA obj1 = new SubSystemA();
private SubSystemB obj2 = new SubSystemB();
private SubSystemC obj3 = new SubSystemC();
public void method(){
obj1.methodA();
obj2.methodB();
obj3.methodC();
}
}
java
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.method();
}
}
3 外观模式应用实例
智能家电控制
通过智能音箱来控制室内的 灯、电视、空调.本来每个设备都需要进行独立的开关操作,现在通过智能音箱完成对这几个设备的统一控制.
java
/**
* 电灯类
**/
public class Light {
public void on(){
System.out.println("打开灯......");
}
public void off(){
System.out.println("关闭灯......");
}
}
java
/**
* 电灯类
**/
public class TV {
public void on(){
System.out.println("打开电视......");
}
public void off(){
System.out.println("关闭电视......");
}
}
java
/**
* 空调类
**/
public class AirCondition {
public void on(){
System.out.println("打开空调......");
}
public void off(){
System.out.println("关闭空调......");
}
}
java
/**
* 智能音箱外观类
**/
public class SmartAppliancesFacade {
private Light light;
private TV tv;
private AirCondition airCondition;
public SmartAppliancesFacade() {
this.light =new Light();
this.tv = new TV();
this.airCondition = new AirCondition();
}
public void say(String message){
if(message.contains("打开")){
on();
}else if(message.contains("关闭")){
off();
}else{
System.out.println("对不起没有听清楚您说什么! 请重新再说一遍");
}
}
//起床后 语音开启 电灯 电视 空调
private void on() {
System.out.println("起床了!");
light.on();
tv.on();
airCondition.on();
}
//睡觉前 语音关闭 电灯 电视 空调
private void off() {
System.out.println("睡觉了!");
light.off();
tv.off();
airCondition.off();
}
}
java
public class Client {
public static void main(String[] args) {
//创建外观对象
SmartAppliancesFacade facade = new SmartAppliancesFacade();
facade.say("打开家电");
facade.say("关闭家电");
}
}
4 外观模式总结
外观模式缺点:
- 不能很好的控制客户端直接使用子系统类,如果客户端访问子系统类做太多的限制则减少了可变性和灵活性.
- 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则.