设计模式---外观模式

问题的抛出:你组装了一套杀手级的系统用来看电影,内含DVD播放器、投影机、自动屏幕、环绕立体声等.每一次你看电影德1时候都要先经历下面一段痛苦的过程1.将灯光调俺2.放下屏幕3.打开投影机4.将投影的输入切换到DVD......,当你弄完了看电影的热情也就没有了,那么有没有什么可以让我看电影的时候按一下按钮就可以了呢?当然有啊!你可以弄一个遥控啊,这个遥控有个按钮,一按就可以,这个遥控就的操做就那么多操作的外观

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

结构组成

Facade:外观角色

SubSustem:子系统角色

案例:将抛出的问题实现了

具体代码如下

/**
 * <p> DVD(子系统一) </p>
 *
 * @author Alemand
 * @since 2018/1/30
 */
public interface DVD {

    /**
     * 播放
     */
    void play();
}
/**
 * <p> 投影仪(子系统二) </p>
 *
 * @author Alemand
 * @since 2018/1/30
 */
public interface Screen {

    /**
     * 放下投影仪
     */
    void drop();
}
/**
 * <p> 音响(子系统三) </p>
 *
 * @author Alemand
 * @since 2018/1/30
 */
public interface Voice {
    /**
     * 调节声音
     */
    void adjust();
}
/**
 * <p> 遥控器(外观角色) </p>
 *
 * @author Alemand
 * @since 2018/1/30
 */
public class Telecontrol {
    /**
     * dvd
     */
    private DVD dvd;
    /**
     * 投影仪
     */
    private Screen screen;
    /**
     * 音响
     */
    private Voice voice;

    public Telecontrol(DVD dvd, Screen screen, Voice voice) {
        this.dvd = dvd;
        this.screen = screen;
        this.voice = voice;
    }
    /**
     * 遥控器控制打开
     */
    public void  turnOn(){
        dvd.play();
        screen.drop();
        voice.adjust();
    }

}
优点:

  • 对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。
  • 实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。
  • 降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
  • 只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。
缺点:
  • 不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。
  • 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。





猜你喜欢

转载自blog.csdn.net/mypersonalsong/article/details/79210037