java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷😁😁
外观模式(Facade Pattern)是一种设计模式,它为子系统中的一组接口提供一个统一的高层接口,使得子系统更加容易使用。这种设计模式的主要目的是降低系统的复杂性,简化客户端与子系统之间的交互。
外观(Facade)模式是“迪米特法则”的典型应用。
迪米特法则:又叫作最少知识原则(The Least Knowledge Principle),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LOD。
我就以自己家里的一些家电为例子,比如我家有电灯,空调,电视这三种家电,然后呢他们都有自己独立的开关,我如果我想要让它们都处于工作状态,我得一件一件地去打开他们的开关,但是呢,我个人比较懒,想着能不能接入一个小雷同学,让它去负责各个家电,我只需要操作小雷同学就可以?
说干就干,首先是我家里的各个电器
//空调
public class AirCondition {
public void on() {
System.out.println("打开了空调....");
}
public void off() {
System.out.println("关闭了空调....");
}
}
//电视机
public class TV {
public void on() {
System.out.println("打开了电视....");
}
public void off() {
System.out.println("关闭了电视....");
}
}
//灯
public class Light {
public void on() {
System.out.println("打开了灯....");
}
public void off() {
System.out.println("关闭了灯....");
}
}
然后呢,我接入一个小雷同学
//智能音箱
public class SmartAppliancesFacade {
private Light light;
private TV tv;
private AirCondition airCondition;
//other household appliance
public SmartAppliancesFacade() {
light = new Light();
tv = new TV();
airCondition = new AirCondition();
}
public void say(String message) {
if (message.contains("开灯")) {
onLamp();
} else if (message.contains("关灯")) {
offLamp();
} else if (message.contains("开电视")) {
onTV();
} else if (message.contains("关电视")) {
offTV();
} else if (message.contains("开空调")) {
onAirCondition();
} else if (message.contains("关空调")) {
offAirCondition();
} else if (message.contains("打开家电")) {
onLamp();
onTV();
onAirCondition();
//on other household appliance
} else if (message.contains("关闭家电")) {
offLamp();
offTV();
offAirCondition();
//off other household appliance
} else {
System.out.println("我还听不懂你说的!!!");
}
}
private void onLamp() {
light.on();
}
private void offLamp() {
light.off();
}
private void onTV() {
tv.on();
}
private void offTV() {
tv.off();
}
private void onAirCondition() {
airCondition.on();
}
private void offAirCondition() {
airCondition.off();
}
}
而对于我来说,我只需要知道小雷同学,而不需要知道各个家电。
public class Client {
public static void main(String[] args) {
//创建外观对象
SmartAppliancesFacade facade = new SmartAppliancesFacade();
//客户端直接与外观对象进行交互
facade.say("小雷同学,请打开家电");
// facade.say("关闭家电");
}
}
执行结果:
打开了灯…
打开了电视…
打开了空调…
这样,对于客户端来说,可以通过一个智能音箱控制全部,而不用管其他的具体实现,只要知道这个接口即可以了。
但是在一些具体的示例中,外观模式的使用可能有所差异,望各位看官老爷们斟酌使用。
外观模式的主要优点包括:
然而,外观模式也有一些潜在的缺点,比如:
代码相关代码可以参考 代码仓库🌐
ps:本文原创,转载请注明出处