前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >外观模式(封装交互,简化调用)

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

作者头像
幺鹿
发布2018-08-21 15:39:46
4540
发布2018-08-21 15:39:46
举报
文章被收录于专栏:Java呓语

前言

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

比如:

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

正文

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

场景分析:

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

代码实现

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

代码语言:javascript
复制
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();
    }
}
代码语言:javascript
复制
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

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.02.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
  • 代码实现
  • 总结
相关产品与服务
腾讯云小微
腾讯云小微,是一套腾讯云的智能服务系统,也是一个智能服务开放平台,接入小微的硬件可以快速具备听觉和视觉感知能力,帮助智能硬件厂商实现语音人机互动和音视频服务能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档