科技感网站,江苏智能网站建设流程,重庆网站优化排名,学校网站建设工作目标设计模式浅析(八) 外观模式
日常叨逼叨
java设计模式浅析#xff0c;如果觉得对你有帮助#xff0c;记得一键三连#xff0c;谢谢各位观众老爷#x1f601;#x1f601; 外观模式
概念
外观模式#xff08;Facade Pattern#xff09;是一种设计模式#xff0c;它为…设计模式浅析(八) ·外观模式
日常叨逼叨
java设计模式浅析如果觉得对你有帮助记得一键三连谢谢各位观众老爷 外观模式
概念
外观模式Facade Pattern是一种设计模式它为子系统中的一组接口提供一个统一的高层接口使得子系统更加容易使用。这种设计模式的主要目的是降低系统的复杂性简化客户端与子系统之间的交互。
外观Facade模式是“迪米特法则”的典型应用。
迪米特法则又叫作最少知识原则The Least Knowledge Principle一个类对于其他类知道的越少越好就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信不和陌生人说话。英文简写为: LOD。
组成
外观类Facade这是外观模式的核心。外观类为客户端提供了一个简洁的接口用于访问子系统中的功能。外观类内部通常包含了对子系统多个组件的引用并且提供了高层次的方法来调用这些组件。客户端不需要直接与子系统组件交互而是通过外观类来间接访问它们。子系统组件Subsystem Components这些是子系统中实际执行操作的类。它们实现了具体的功能但通常对于客户端来说是不可见的。外观类负责协调这些组件的工作并将结果呈现给客户端。客户端Client客户端是使用外观模式的代码部分。它只需要与外观类交互而不需要了解子系统的具体实现细节。客户端通过调用外观类提供的方法可以间接地使用子系统提供的功能。
案例 我就以自己家里的一些家电为例子比如我家有电灯空调电视这三种家电然后呢他们都有自己独立的开关我如果我想要让它们都处于工作状态我得一件一件地去打开他们的开关但是呢我个人比较懒想着能不能接入一个小雷同学让它去负责各个家电我只需要操作小雷同学就可以 说干就干首先是我家里的各个电器
//空调
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 appliancepublic 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本文原创转载请注明出处