外观模式
外观模式解决的是复杂系统的问题,将复杂系统的多个步骤封成一个步骤对外呈现,减少客户端的操作,比如说一个家里有电视,冰箱,电灯,我回家需要把这些依次打开,如果有一个开关,这个把这三都开了多好,这个总开关就是外观;外观模式主要是省略了交互,原先客户端需要和电视,冰箱,电灯都交互才能完成全部动作,现在只需要和外观类交互即可
外观模式可以将类图1转化为类图2
类图1:
类图二:
外观类:
public class Facade {
private TV tv;
private IceBox iceBox;
private Light light;
public Facade() {
this.tv = new TV();
this.iceBox = new IceBox();
this.light = new Light();
}
public void open() {
this.tv.OpenTV();
this.iceBox.OpenIceBox();
this.light.OpenLight();
}
}
各个需要被外观的类:
public class TV {
public void OpenTV(){
System.out.println("打开电视");
}
}
public class IceBox {
public void OpenIceBox(){
System.out.println("打开冰箱");
}
}
public class Light {
public void OpenLight(){
System.out.println("打开电灯");
}
}
客户端:
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.open();
}
}
结果:
打开电视
打开冰箱
打开电灯
静态代理
静态代理的类图和外观很像,还是刚才的例子,冰箱、电视、电灯打开的问题,如果外观类的代码变为以下情况就是静态代理了
public class Facade {
private TV tv;
private IceBox iceBox;
private Light light;
public Facade() {
this.tv = new TV();
this.iceBox = new IceBox();
this.light = new Light();
}
public void OpenTV() {
this.tv.OpenTV();
}
public void OpenIceBox() {
this.iceBox.OpenIceBox();
}
public void OpenLight() {
this.light.OpenLight();
}
}
客户端:
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.OpenTV();
facade.OpenIceBox();
facade.OpenLight();
}
}
结果:
打开电视
打开冰箱
打开电灯
也就是说静态代理只是对其他对象的行为进行简单的调用,并不进行组合
静态代理类图:
外观和静态代理的区别
模式 | 是否持有其他对象 | 是否对其他对象的行为进行组合 |
---|---|---|
外观 | 持有 | 组合 |
静态代理 | 持有 | 不组合 |