外观模式

75 阅读2分钟

外观模式

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。它向现有的系统添加一个接口,来隐藏系统的复杂性。

这个我想起了日志门面库sl4j。我感觉和这个特别像。


结构

  • 外观角色:为多个子系统对外提供一个共同的接口。

  • 子系统角色:实现系统的部分功能,客户可以通过外观角色访问它。

image.png

代码

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();
    }
}

运行结果:

打开灯光
打开电视

源码 design_pattern

分析

好处:

降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。

对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。

缺点:

不符合开闭原则,修改很麻烦