设计模式之外观模式

导读:本篇文章讲解 设计模式之外观模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

外观模式基本介绍

  1. 外观模式(Facade),也叫过程模式,外观模式为子系统中的一组接口提供
    一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加
    容易使用;
  2. 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端
    只需跟这个接口发生调用,而无需关心这个子系统的内部细节

示例

影院例子

package com.lesson11.waiguan;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/9/2 19:21
 */
public class DVDPlay
{
    private static DVDPlay instance = new DVDPlay();

    private DVDPlay()
    {
    }

    public static DVDPlay getInstance(){
        return instance;
    }

    public void on(){
        System.out.println("on");
    }

    public void off(){
        System.out.println("off");
    }

    public void play(){
        System.out.println("play");
    }

    public void pause(){
        System.out.println("pause");
    }
}

package com.lesson11.waiguan;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/9/2 19:23
 */
public class BaoMiHua
{
    private BaoMiHua(){}

    private static BaoMiHua instance = new BaoMiHua();

    public static BaoMiHua getInstance(){
        return instance;
    }

    public void on(){
        System.out.println("爆米花机on");
    }

    public void off(){
        System.out.println("爆米花机off");
    }

    public void pop(){
        System.out.println("爆米花机pop");
    }
}

package com.lesson11.waiguan;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/9/2 19:29
 */
public class Light
{
    private Light(){}

    private static Light instance = new Light();

    public static Light getInstance(){
        return instance;
    }

    public void on(){
        System.out.println("灯光on");
    }

    public void off(){
        System.out.println("灯光off");
    }
}

package com.lesson11.waiguan;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/9/2 19:27
 */
public class Screen
{
    private Screen(){}

    private static Screen instance = new Screen();

    public static Screen getInstance(){
        return instance;
    }

    public void up(){
        System.out.println("屏幕up");
    }

    public void down(){
        System.out.println("屏幕down");
    }
}

package com.lesson11.waiguan;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/9/2 19:25
 */
public class TouYing
{
    private TouYing(){}

    private static TouYing instance = new TouYing();

    public static TouYing getInstance(){
        return instance;
    }

    public void on(){
        System.out.println("投影仪on");
    }

    public void off(){
        System.out.println("投影仪off");
    }

    public void focus(){
        System.out.println("投影仪focus");
    }
}

package com.lesson11.waiguan;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/9/2 19:28
 */
public class YinXiang
{
    private YinXiang(){}

    private static YinXiang instance = new YinXiang();

    public static YinXiang getInstance(){
        return instance;
    }

    public void on(){
        System.out.println("音响on");
    }

    public void off(){
        System.out.println("音响off");
    }
}

package com.lesson11.waiguan;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/9/2 19:33
 */
public class Home
{
    //定义子系统对象
    private BaoMiHua baoMiHua;
    private DVDPlay dvdPlay;
    private Light light;
    private Screen screen;
    private TouYing touYing;
    private YinXiang yinXiang;

    public Home()
    {
        this.baoMiHua = BaoMiHua.getInstance();
        this.dvdPlay = DVDPlay.getInstance();
        this.light = Light.getInstance();
        this.screen = Screen.getInstance();
        this.touYing = TouYing.getInstance();
        this.yinXiang = YinXiang.getInstance();
    }

    public void ready(){
        baoMiHua.on();
        baoMiHua.pop();
        screen.down();
        touYing.on();
        yinXiang.on();
        dvdPlay.on();
    }

    public void play(){
        dvdPlay.play();
    }

    public void pause(){
        dvdPlay.pause();
    }

    public void end(){
        baoMiHua.off();
        screen.up();
        touYing.off();
        yinXiang.off();
        dvdPlay.off();
    }
}

package com.lesson11.waiguan;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/9/2 19:30
 */
public class Client
{
    public static void main(String[] args)
    {
        Home home = new Home();
        home.ready();
        home.play();
    }
}

灵魂在于设计分层 ——沃兹基朔德

小结

  1. 外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性;
  2. 外观模式对客户端与子系统的耦合关系,让子系统内部的模块更易维护和扩展;
  3. 通过合理的使用外观模式,可以帮我们更好的划分访问的层次;
  4. 当系统需要进行分层设计时,可以考虑使用Facade模式;
  5. 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade类,来提供遗留系统的比较清晰简单的接口,让新系统与Facade类交互,提高复用性;
  6. 不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好。要以让系统有层次,利于维护为目的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16433.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!