外观模式(封装交互,简化调用)

前言

机器人Samu与主人Alice的故事仍在继续,这次Samu宕机了。Alice重启了SamuSamu在每次重启的时候都会做些预定的事件。

比如:

  • 初始化多种音乐类型的曲库
  • 跳舞(肚皮舞)
  • 唱歌(千里之外)
  • 做菜(红烧肉)

正文

现在需要实现初始化这个功能,这个功能包含的子功能已经在上面陈列出来了。

场景分析:

  • 我们把“人与机器人”称作“人机交互的上下文”。HumanComputerInteraction.Context
  • 我们把 “人与机器人对话的过程” 称作一次“人机交互”。HumanComputerInteraction

代码实现

先看下面两段代码片段,没有任何接口、继承等。我想说设计模式应着重理解其思想,而非特定模式下的结构实现

public class Client {

    public static void main(String[] args) {
        // 创建交互的上下文对象 —— 即"谁与机器人在交互"。
        HumanComputerInteraction.Context context = new HumanComputerInteraction.Context(new Machine("Samu"), new User("Alice"));
        // 创建人机交互对象
        HumanComputerInteraction interaction = new HumanComputerInteraction(context);
        // 初始化人机交互
        interaction.setUp();
    }
}
public class HumanComputerInteraction {

    private Context context;

    public HumanComputerInteraction(HumanComputerInteraction.Context context) {
        this.context = context;
    }

    public void setUp() {
        // 初始化曲库
        final Machine machine = context.getMachine();
        final MusicDatabase database = machine.getDatabase();
        database.initDatabase();
        // 初始化命令
        final Invoker invoker = context.getInvoker();
        invoker.invoke(new CommandAdapter(CookCommandImpl.KEY_COOK, "红烧肉", context));
        invoker.invoke(new CommandAdapter(DanceCommandImpl.KEY_DANCE, "肚皮舞", context));
        invoker.invoke(new CommandAdapter(SongCommandImpl.KEY_SONG, "千里之外", context));
    }
}

setUp方法中封装了,初始化曲库、唱歌、跳舞、做菜等一系列事项。其也体现了外观模式(也称作 门面模式)的本质:封装交互,简化调用

总结

外观模式的本质:封装交互,简化调用。

外观模式本质.png

如上图,蓝色背景其实可以视作一个子系统,由外观类组合拼装各个功能块。如果需要暴露子系统的功能,则会考虑暴露子系统的接口。这意味着在一个良好设计的系统中,子系统仅暴露它应该暴露的接口。因为子系统并不知道,调用它的是外观类还是客户端类。

引入外观类是为了解耦与子系统的关联,但并不限制客户端直接调用子系统。

不建议在外观类中增加子系统的功能,因为这并不符合外观模式封装交互,简化调用的本质。建议直接扩展子系统的功能。

当子系统功能发生改变时,可能需要修改外观类以适应子系统功能的变化,导致外观模式不符合开闭原则。你可以通过抽象外观类,一定程度上缓解该问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,016评论 25 708
  • 1 场景问题# 1.1 生活中的示例## 外观模式在现实生活中的示例很多,比如:组装电脑,通常会有两种方案。 一个...
    七寸知架构阅读 6,286评论 7 57
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,970评论 1 15
  • 设计模式基本原则 开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。开-闭原...
    西山薄凉阅读 3,856评论 3 14
  • 带着几分好奇,也带着几分相思,轻轻的推开你院地的栅门,一股淡淡的兰香顿时浸染全身。漫步那长满青兰的阶梯,看满院的斑...
    关于星座那些事儿阅读 406评论 0 0