外观模式
外观模式解决的是复杂系统的问题,将复杂系统的多个步骤封成一个步骤对外呈现,减少客户端的操作,比如说一个家里有电视,冰箱,电灯,我回家需要把这些依次打开,如果有一个开关,这个把这三都开了多好,这个总开关就是外观;外观模式主要是省略了交互,原先客户端需要和电视,冰箱,电灯都交互才能完成全部动作,现在只需要和外观类交互即可
外观模式可以将类图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();
}
}
结果:
打开电视
打开冰箱
打开电灯
也就是说静态代理只是对其他对象的行为进行简单的调用,并不进行组合
静态代理类图:
外观和静态代理的区别
| 模式 | 是否持有其他对象 | 是否对其他对象的行为进行组合 |
|---|---|---|
| 外观 | 持有 | 组合 |
| 静态代理 | 持有 | 不组合 |
本文对比了外观模式和静态代理两种设计模式。外观模式通过封装复杂系统的多个步骤为单一操作来简化客户端使用流程,而静态代理则直接调用其他对象的行为而不进行组合。通过具体例子展示了两种模式的不同之处。
967

被折叠的 条评论
为什么被折叠?



