外观模式
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。它向现有的系统添加一个接口,来隐藏系统的复杂性。
这个我想起了日志门面库sl4j。我感觉和这个特别像。
结构
-
外观角色:为多个子系统对外提供一个共同的接口。
-
子系统角色:实现系统的部分功能,客户可以通过外观角色访问它。
代码
package wnan.facade.sub;
/*****UTF-8*****
* Description: 家电 子系统接口
* Author: wnan
* Create Date: 2024/10/3 22:19
* Proverbs: 吃得苦中苦,方为人上人
*/
public interface HomeAppliances {
void on();
void off();
}
package wnan.facade.sub;
/*****UTF-8*****
* Description: 灯光 子系统实现类
* Author: wnan
* Create Date: 2024/10/3 22:21
* Proverbs: 吃得苦中苦,方为人上人
*/
public class Light implements HomeAppliances{
@Override
public void on() {
System.out.println("打开灯光");
}
@Override
public void off() {
System.out.println("关闭灯光");
}
}
package wnan.facade.sub;
/*****UTF-8*****
* Description: 电视 子系统实现类
* Author: wnan
* Create Date: 2024/10/3 22:22
* Proverbs: 吃得苦中苦,方为人上人
*/
public class TV implements HomeAppliances{
@Override
public void on() {
System.out.println("打开电视");
}
@Override
public void off() {
System.out.println("关闭电视");
}
}
package wnan.facade;
import wnan.facade.sub.Light;
import wnan.facade.sub.TV;
/*****UTF-8*****
* Description: 智能体 外观角色
* Author: wnan
* Create Date: 2024/10/3 22:24
* Proverbs: 吃得苦中苦,方为人上人
*/
public class SmartApplicationFacade {
private final Light light;
private final TV tv;
public SmartApplicationFacade(){
light=new Light();
tv=new TV();
}
public void onLight(){
light.on();
}
public void offLight(){
light.off();
}
public void onTV(){
tv.on();
}
public void offTV(){
tv.off();
}
}
package wnan.facade;
/*****UTF-8*****
* Description: 外观模式
* Author: wnan
* Create Date: 2024/10/3 22:08
* Proverbs: 吃得苦中苦,方为人上人
*/
public class Client {
public static void main(String[] args) {
SmartApplicationFacade app=new SmartApplicationFacade();
app.onLight();
app.onTV();
}
}
运行结果:
打开灯光
打开电视
分析
好处:
降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
缺点:
不符合开闭原则,修改很麻烦