设计模式系列(一)门面模式(外观模式)

⻔⾯模式定义:⻔⾯模式(Facade Pattern)⼜称为外观模式,提供了⼀个统⼀的接⼝,⽤来访问⼦系统中的⼀群接⼝。其主要特征是定义了⼀个⾼层接⼝, 让⼦系统更容易使⽤。
image.png
门面模式主要包含2种角色:
外观角色(Facade):也称⻔⾯⻆⾊,系统对外的统⼀接⼝。
**⼦系统⻆⾊(SubSystem):**可以同时有⼀个或多个 SubSystem。每个 SubSytem 都不是⼀个单独的类,
⽽是⼀个类的集合。SubSystem 并不知道 Facade 的存在,对于 SubSystem ⽽⾔, Facade 只是另⼀个
客⼾端⽽已(即 Facade 对 SubSystem 透明)。
门面模式的实现:
场景: 回家, 我们会开各个屋的灯. 离开家时, 会关闭各个屋的灯,如果家⾥设置⼀个总开关, 来控制整个屋的灯就会很⽅便。
我们使⽤⻔⾯模式的实现:
子系统角色中的类:

package com.xiaoyu.captcha.facade;

public class LivingRoomLight implements Light{
    @Override
    public void on() {
        System.out.println("打开客厅灯");
    }

    @Override
    public void off() {
        System.out.println("关闭客厅灯");
    }
}

package com.xiaoyu.captcha.facade;

public class HallLight implements Light{
    @Override
    public void on() {
        System.out.println("打开走廊灯");
    }

    @Override
    public void off() {
        System.out.println("关闭走廊灯");
    }
}

package com.xiaoyu.captcha.facade;

public class BedRoomLight implements Light {
    @Override
    public void on() {
        System.out.println("打开卧室灯");
    }

    @Override
    public void off() {
        System.out.println("关闭卧室灯");
    }
}

门面角色类:

package com.xiaoyu.captcha.facade;

public class LightFacade {
    // 门面角色
    LivingRoomLight livingRoomLight = new LivingRoomLight();
    HallLight hallLight = new HallLight();
    BedRoomLight bedRoomLight = new BedRoomLight();

    // 打开所有灯
    void on() {
        livingRoomLight.on();
        hallLight.on();
        bedRoomLight.on();
    }
    // 关闭所有灯
    void off() {
        livingRoomLight.off();
        hallLight.off();
        bedRoomLight.off();
    }
}

客户端角色类:

package com.xiaoyu.captcha.facade;

public class FacadeDemo {
    public static void main(String[] args) {
        // 客户端角色
        // 打开所有的灯
        LightFacade lightFacade = new LightFacade();
        lightFacade.on();
    }
}

一个系统可以有几个门面类?
在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。当然这并不意味着在整个系统里只有一个门面类,而仅仅是说对每一个子系统只有一个门面类。或者说,如果一个系统有好几个子系统的话,每一个子系统都有一个门面类,整个系统可以有数个门面类。
门面模式的优点:

  • 减少了系统的相互依赖。松散了客⼾端与⼦系统的耦合关系, 这使得⼦系统的变化不会影响到调⽤它的客户端;
  • 提⾼了灵活性,简化了客⼾端对⼦系统的使⽤难度,客⼾端⽆需关⼼⼦系统的具体实现⽅式,⽽只需要和⻔⾯对象交互即可;
  • 提⾼了安全性.。可以灵活设定访问权限, 不在⻔⾯对象中开通⽅法, 就⽆法访问。
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值