Android 设计模式 - 外观模式

1. 定义

外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

2. 作用

为了实现客户类和子系统的解耦,降低系统的使用复杂度。比如说,我们晚上下班回家后,要打开电灯、空调、电视,如果能有个控制器,实现一键打开这些电器的功能就好了。

3. 结构

外观模式包含如下角色:

  • Facade: 外观角色
  • SubSystem:子系统角色
4. 实现

  1. 子系统角色,就是上面提到的电灯、空调、电视,都可以被打开和关闭。
public class LightSystem {

    public void turnOn() {
        System.out.println("Turn on the light");
    }

    public void turnOff() {
        System.out.println("Turn off the light");
    }
}

复制代码
public class TelevisionSystem {

    public void turnOn() {
        System.out.println("Turn on the tv");
    }

    public void turnOff() {
        System.out.println("Turn off the tv");
    }
}

复制代码
public class AirConditionSystem {

    public void turnOn() {
        System.out.println("Turn on the air-condition");
    }

    public void turnOff() {
        System.out.println("Turn off the air-condition");
    }
}

复制代码
  1. 外观角色,控制器,把各种电器的开闭都封装在这里,对外只提供一键操作的接口。
public class FacadeController {
    private LightSystem lightSystem;
    private TelevisionSystem televisionSystem;
    private AirConditionSystem airConditionSystm;

    public FacadeController() {
        lightSystem = new LightSystem();
        televisionSystem = new TelevisionSystem();
        airConditionSystm = new AirConditionSystem();
    }

    public void onKeyTurnOn() {
        lightSystem.turnOn();
        televisionSystem.turnOn();
        airConditionSystm.turnOn();
    }

    public void onKeyTurnOff() {
        lightSystem.turnOff();
        televisionSystem.turnOff();
        airConditionSystm.turnOff();
    }
}

复制代码
  1. 客户类,使用控制器一键操作开关,省时又省力。
public class FacadeTest {

    public static void main(String[] args){
        System.out.println("-------- Turn on ----------");
        FacadeController facadeController = new FacadeController();
        facadeController.onKeyTurnOn();

        System.out.println("-------- Turn off ----------");
        facadeController.onKeyTurnOff();
    }
}

复制代码
5. 优缺点

1. 优点:

对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。它实现了子系统与客户之间的松耦合关系,并降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程。

2. 缺点:

不能很好地限制客户使用子系统类,而且在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了「开闭原则」。

3. 使用场景:

要为一个复杂子系统提供一个简单接口;客户程序与多个子系统之间存在很大的依赖性;在层次化结构中,需要定义系统中每一层的入口,使得层与层之间不直接产生联系。

转载于:https://juejin.im/post/5c9a38bd6fb9a0711103e195

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值