设计模式(结构型设计模式——外观模式)

设计模式(结构型设计模式——外观模式)

外观模式

基本定义

外观模式是为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。
外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

模式结构

Facade: 外观角色类
SubSystem: 子系统角色

代码实现

Facade: 外观角色类

模拟:回家-> 开灯,开空调,开电视机。休息->关电视机,关空调,关灯

public class Facade {

    Light light;
    Air air;
    TV tv;

    public Facade(Light light, Air air, TV tv) {
        this.light = light;
        this.air = air;
        this.tv = tv;
    }

    public void allOpen(){
        light.open();
        air.open();
        tv.open();
    }

    public void allDown(){
        tv.down();
        air.down();
        light.down();
    }
}
SubSystem: 子系统角色

灯光

@Slf4j
public class Light {

    public void open(){
        log.info("开灯");
    };

    public void down(){
        log.info("关灯");
    }
}

空调

@Slf4j
public class Air {

    public void open(){
        log.info("打开空调");
    };

    public void down(){
        log.info("关闭空调");
    }
}

电视机

@Slf4j
public class TV {
    public void open(){
        log.info("打开电视机");
    };

    public void down(){
        log.info("关闭电视机");
    }
}
测试类
public class Test {

    public static void main(String[] args){
        Facade facade = new Facade(new Light(), new Air(), new TV());
        facade.allOpen();//print: 开灯, 打开空调,打开电视机
        facade.allDown();//print: 关闭电视机,关闭空调,关灯
    }
}

优点

  1. 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
  2. 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
  3. 降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程。
  4. 符合迪米特法则,即最少知道原则。

缺点

在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

使用场景

当要为一个复杂子系统提供一个简单接口时可以使用外观模式。

客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。

总结

外观模式的主要优点就在于减少了客户与子系统之间的关联对象,使用客户对子系统的使用变得简单了,也实现了客户与子系统之间的松耦合关系。它的缺点就在于违背了“开闭原则”。

如果需要实现一个外观模式,需要将子系统组合进外观类中,然后将工作委托给子系统执行。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值