设计模式—外观模式

作者: HJXANDHMR | 来源:发表于2016-06-05 17:30 被阅读100次

今天我们来学习另一种结构型模式,它就是外观模式(Facade Pattern)。

模式定义

外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

模式结构

外观模式包含如下角色:

**Facade: ** 外观角色
**SubSystem: **子系统角色

UML图

代码实现

电视遥控器是现实生活中一个比较好的外观模式的运用,遥控器可以控制电源的开源、声音的调整、频道的切换等。这个遥控器就是我们这里说的外观或者门面,而电源、声音、频道切换系统就是我们的子系统。遥控器统一对这些子模块的控制,我想你没有用过多个遥控器来分别控制电源开关、声音控制等功能。下面我们就来简单模拟一下这个系统。

PowerSystem.java

/**
 * 电源控制系统
 */
public class PowerSystem {

    public void powerOn() {
        System.out.println("Power On");
    }

    public void powerOff() {
        System.out.println("Power Off");
    }
}

ChannelSystem.java


/**
 * 频道控制系统
 */
public class ChannelSystem {

    public void next() {
        System.out.println("Next channel ");
    }

    public void previous() {
        System.out.println("Previous channel");
    }
}

PowerSystem.java


/**
 * 电源控制系统
 */
public class PowerSystem {

    public void powerOn() {
        System.out.println("Power On");
    }

    public void powerOff() {
        System.out.println("Power Off");
    }
}

VoiceSystem.java


/**
 * 声音控制系统
 */
public class VoiceSystem {

    public void turnUp() {
        System.out.println("Voice turn Up");
    }

    public void turnDown() {
        System.out.println("Voice turn Down");
    }
}


TvController.java


/**
 * 遥控器
 */
public class TvController {

    private PowerSystem mPowerSystem;
    private VoiceSystem mVoiceSystem;
    private ChannelSystem mChannelSystem;

    public TvController() {
        mPowerSystem = new PowerSystem();
        mVoiceSystem = new VoiceSystem();
        mChannelSystem = new ChannelSystem();
    }

    public void powerOn() {
        mPowerSystem.powerOn();
    }

    public void powerOff() {
        mPowerSystem.powerOff();
    }

    public void turnUp() {
        mVoiceSystem.turnUp();
    }

    public void turnDown() {
        mVoiceSystem.turnDown();
    }

    public void NextChannel() {
        mChannelSystem.next();
    }

    public void PreviousChannel() {
        mChannelSystem.previous();
    }
}

测试类


public class MyClass {

    public static void main(String[] args) {

        TvController tvController = new TvController();
        tvController.powerOn();
        tvController.turnUp();
        tvController.PreviousChannel();
        tvController.powerOff();
    }
}

运行结果

模式分析

根据“单一职责原则”,在软件中将一个系统划分为若干个子系统有利于降低整个系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统的访问提供了一个简单而单一的入口。

外观模式的优点

  • 对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。

  • 实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。

  • 降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。

  • 只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。

外观模式的缺点

  • 不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。

  • 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

本博客同步发表在 http://hjxandhmr.github.io/2016/06/05/DesignPattern-Facade/

参考
http://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/facade.html

相关文章

  • Android设计模式——外观模式(七大结构型)

    1.外观模式介绍 外观模式(Facade Pattern),是七大结构型设计模式之一。 外观模式运...

  • 设计模式[9]-外观模式-Facade Pattern

    1. 外观模式 外观模式(Facade Pattern),又称为门面模式,是非常常用的结构性设计模式。外观模式使得...

  • java设计模式-外观模式(Facade)

    外观模式,属于结构性模式。属于设计模式里面比较简单的设计模式,本人认为是最简单的设计模式。 所谓外观,就是我们能看...

  • 了解外观模式

    java 设计模式 ------外观模式 Java中一共有23种设计模式,每种设计模式各有特...

  • 设计模式之-4.外观模式

    每看一次设计模式,感觉每一个设计模式看起来是那么简单,对于外观模式我的理解就是外观模式:外观模式,这个名字起得不怎...

  • 设计模式详解——外观模式

    本篇文章介绍一种设计模式——外观模式。本篇文章内容参考《JAVA与模式》之门面模式,外观模式,深入浅出外观模式(二...

  • 外观模式(Facede)

    本文参考自: 《JAVA设计模式》之外观模式(Facade) 1. 作用 外观模式也叫门面模式,门面模式是对象的结...

  • 设计模式---外观模式

    1、外观模式(Facade):也叫门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个...

  • 设计模式——外观模式

    阎宏博士的《JAVA与模式》一书中开头是这样描述外观(Facade)模式的:门面模式是对象的结构模式,外部与一个子...

  • 设计模式--外观模式

    一、举个栗子小明每天回家都会先打开灯,空气净化器,电热水器烧上水,放上音乐,如果天气热的话,再打开空调。写成代码 ...

网友评论

    本文标题:设计模式—外观模式

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