HeadFirst设计模式-外观模式

定义

外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

实例

以家庭影院为例,准备放松准备开始感受电影的魔幻魅力。可能需要的步骤:

  1. 开始爆米花
  2. 将灯光调暗
  3. 放下屏幕
  4. 打开投影机
  5. 切换输入源
  6. 设置环绕立体声
  7. 开始播放电影

需要不少的步骤才能开始观看电影。但还不只这样。

  • 看完电影后,你还要把一切都关掉,要反向地把这一切动作再进行一次。

  • 如果要听广播,难道也这么麻烦?

  • 如果你决定升级系统,可能还必须重新学习一套稍微不同的操作过程。

使用家庭影院变得如此复杂。看看外观模式如何解决这团混乱。

第一步是使用组合让外观能够访问子系统中所有的组件。

public class HomeTheaterFacade {
    // 爆米花
    Popcorn popcorn;
    // 灯光
    Lights lights;
    // 屏幕
    Screen screen;
    // 投影仪
    Projector projector;
    // 调音
    Tuner tuner;
    // 播放
    Player player;
    
    public HomeTheaterFacade(Popcorn popcorn,
                            Lights lights,
                            Screen screen,
                            Projector projector,
                            Tuner tuner,
                            Player player) {
        this.popcorn = popcorn;
        this.lights = lights;
        this.screen = screen;
        this.projector = projector;
        this.tuner = tuner;
        this.player = player;
    }
}

现在将子系统的组件整合成一个统一的接口。让我们是子安watchMovie()和endMovie()两个方法。

public void watchMovie(String movie) {
    System.out.println("Get ready to watch a movie...");
    popper.on();
    popper.pop();
    lights.dim(10);
    screen.down();
    projector.on();
    tuner.on();
    player.on();
    player.play(movie);
}

public void endMovie() {
    System.out.println("Shutting movie theater down...");
    popper.off();
    lights.on();
    screen.up();
    projector.off();
    tuner.stop();
    player.off();
}

这样,就可以简单轻松方式观赏电影了。

现在来看一个新的原则。

最少知识原则

最少知识原则告诉我们要减少对象之间的交互,中留下几个密友。这个原则定义:

设计原则

最少知识原则:只和你的密友谈话。

这个原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中一部分,会影响到其他部分,如果许多泪之间相互依赖,那么这个系统就会变成一个易碎的系统,它需要花许多成本维护,也会因为太复杂也不容易被其他人了解。

属于密友的对象

  • 该对象本身

  • 被当做方法的参数而传递进来的对象

  • 此方法所创建或实例化的任何对象

  • 对象的任何组件

不属于密友的对象

对象是调用其他的方法的返回结果。比如:

public float getTemp() {
    return station.getThermometer().getTemperature();
}

还有另一个原则,叫做迪米特法则(Law of Demeter)。它跟最少知识原则是一样。但我们倾向于使用最少知识原则称呼是基于以下两个原因:(1)这个名字更直接。(2)法则(law)给人的感觉是强制的。事实上,没有任何原则是法律(law),所有的原则都应该在有帮助的时候才遵守。

小结

  1. 当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观。

  2. 外观将客户从一个复杂的子系统中解耦。

  3. 实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行。

  4. 适配器将一个对象包装起来以改变其接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象包装起来以简化其接口。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值