结构型模式之外观模式

外观模式

什么是外观模式?

要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口,使得子系统更易于使用。

动机

将一个系统划分成为若干个子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。达到该目标的途径之一是就是引入一个外观(facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面。(出自《设计模式:可复用面向对象软件的基础》)。
在这里插入图片描述

结构与角色

在这里插入图片描述

  1. 外观(Facade)角色:为多个子系统对外提供一个共同的接口。
  2. 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
  3. 客户(Client)角色:通过一个外观角色访问各个子系统的功能。

协作

客户想要访问子系统的功能要通过外观对象去实现,而不是直接去访问子系统。

效果

优点

  1. 对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
  2. 降低了客户端与子系统类的耦合度,实现了子系统与客户之间的松耦合关系。
  3. 外观类对子系统的接口封装,使得系统更易于使用。
  4. 提高灵活性,不管子系统如何变化,只要不影响门面对象,就可以自由修改。

缺点

  1. 不能很好地限制客户使用子系统类,很容易带来未知风险。
  2. 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
  3. 不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

开发中的例子

例如我们在MVC中,Controller层去调用Service层,而不会去关系ServiceImpl的具体细节,那么Service就相当于是外观,无论ServiceImpl如何变化,都不会影响客户通过外观去使用它。只关注Service,不关注具体Service的实现。

代码实现

FacadeClass

package com.wlj.facade;

/**
 * @author wlj
 * @Classname FacadeClass
 * @Description 外观
 * @Date 7/2/2022 5:22 PM
 */
public class FacadeClass {
    private SubSystem01 subSystem01 = new SubSystem01();
    private SubSystem02 subSystem02 = new SubSystem02();
    public void doSth(String sth ){
        if(sth.equals("music")){
            subSystem01.playMusic();
        }
        if(sth.equals("game")){
            subSystem02.playGame();
        }
    }
}

SubSystem01

package com.wlj.facade;

/**
 * @author wlj
 * @Classname SubSystem01
 * @Description 子系统1
 * @Date 7/2/2022 5:22 PM
 */
public class SubSystem01 {
    public void playMusic(){
        System.out.println("子系统1上播放音乐");
    }
}

SubSystem02

package com.wlj.facade;

/**
 * @author wlj
 * @Classname SubSystem02
 * @Description 子系统2
 * @Date 7/2/2022 5:31 PM
 */
public class SubSystem02 {
    public void playGame(){
        System.out.println("子系统2上玩游戏");
    }
}

Client

package com.wlj.facade;
/**
 * @author wlj
 * @Classname Client
 * @Description 用户
 * @Date 7/2/2022 5:32 PM
 */
public class Client {
    public static void main(String[] args) {
        // 用户无需知道子系统具体实现细节,只需要知道外观角色即可。
        FacadeClass facade = new FacadeClass();
        facade.doSth("music");
        facade.doSth("game");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++常见的结构型模式包括以下几种: 1. 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另外一个接口。适配器模式可以让原本不兼容的类可以协同工作。 2. 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。桥接模式可以减少系统类的数量,并降低它们之间的耦合。 3. 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式可以使客户端可以像处理单个对象一样来处理对象的组合。 4. 装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,同时又不改变其原有的结构。装饰模式可以在不修改对象的基础上给对象增加新的行为。 5. 外观模式(Facade Pattern):为子系统的一组接口提供一个统一的接口,以便更方便地访问子系统的功能。外观模式可以简化客户端与子系统之间的交互。 6. 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。享元模式可以提高系统的性能和资源利用率。 7. 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。代理模式可以增加额外的逻辑,比如权限控制、缓存等。 这些模式都有各自的优点和适用场景,在实际开发可以根据需求选择合适的结构型模式进行设计和实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w͏l͏j͏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值