美文网首页设计模式
外观模式(封装交互,简化调用)

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

作者: 幺鹿 | 来源:发表于2017-02-21 15:43 被阅读12次

前言

机器人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

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

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

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

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

相关文章

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

    前言 机器人Samu与主人Alice的故事仍在继续,这次Samu宕机了。Alice重启了Samu,Samu在每次重...

  • 设计模型-行为结构型-外观模型

    设计模型-行为结构型-外观模型 本质:封装交互,简化调用。 描述:外观模型封装了子系统多个模块内的交互过程,为客户...

  • 外观模式

    外观模式的本质是:封装交互,简化调用 何时选用外观模式? 1.如果你希望为一个复杂的子系统提供一个简单接口的时候,...

  • 二十、外观模式(Facade Pattern)

    1. 何为外观模式 外观模式是对多个对象中的多个方法进行封装,外观模式是对多个接口进行整合,以简化用户调用的方式。...

  • 11.5设计模式-外观模式-详解

    设计模式-外观模式 retrofit。引入一个外观角色,来简化客户端与系统之间的交互。加快功能速度,降低系统的复杂...

  • java设计模式10(外观模式)

    外观模式通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,使子系统与客户端...

  • iOS 外观模式

    外观模式封装,隐藏实现细节。简化了操作,简化流程,解耦,简化操作逻辑。 应用,适用场景复杂的子系统,改进使用操作类...

  • 外观模式

    前言 外观模式是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,隐藏了系...

  • (二)设计模式之外观模式

    外观模式是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统...

  • Android设计模式之(21)----外观模式

    外观模式 外观模式属于结构型设计模式. 简单来说外观模式就是一个比较牛逼的封装理解而已.将一系列的操作,功能封装在...

网友评论

  • 幺鹿:想找群小伙伴互相勘误彼此的文章,站在不同的角度提点建议、批判,有意向的朋友可以私信我:smile:

本文标题:外观模式(封装交互,简化调用)

本文链接:https://www.haomeiwen.com/subject/lahuwttx.html