外观模式的学习

家庭影院管理项目:

​ 当你想看电影时,你需要 开爆米花机->开投影仪->开机顶盒选择电影->拿爆米花->调低灯光->播放->结束后,关闭各种设备。

传统模式

在这里插入图片描述

​   通过main来创建各大对象,使用一系列方法。

问题:

​  创建许多的对象,并调用相关方法,容易造成调用过程混乱,没有清晰的过程。

​  不利于在main中维护系统的操作

解决思路:定义一个高层接口,给子系统一组接口提供一致的界面。例如:对智能AI说 我要看电影,于是机器开始运行。等电影结束了,便关闭相关机器。

 

外观模式

 通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心子系统的内部细节。

 

外观模式结构

在这里插入图片描述

 1.外观 (Facade) 提供了一种访问特定子系统功能的便捷方式, 其了解如何重定向客户端请求, 知晓如何操作一切活动部件

 2.创建附加外观 (Additional Facade) 类可以避免多种不相关的功能污染单一外观, 使其变成又一个复杂结构。 客户端和其他外观都可使用附加外观。

 3.复杂子系统 (Complex Subsystem) 由数十个不同对象构成。 如果要用这些对象完成有意义的工作, 你必须深入了解子系统的实现细节, 比如按照正确顺序初始化对象和为其提供正确格式的数据。

 子系统类不会意识到外观的存在, 它们在系统内运作并且相互之间可直接进行交互。

 4.客户端 (Client) 使用外观代替对子系统对象的直接调用。

 

外观模式适合应用场景

 1.如果你需要一个指向复杂子系统的直接接口, 且该接口的功能有限, 则可以使用外观模式。

 2.如果需要将子系统组织为多层结构, 可以使用外观。

 

实现方式

 1.考虑能否在现有子系统的基础上提供一个更简单的接口。 如果该接口能让客户端代码独立于众多子系统类, 那么你的方向就是正确的。

 2.在一个新的外观类中声明并实现该接口。 外观应将客户端代码的调用重定向到子系统中的相应对象处。 如果客户端代码没有对子系统进行初始化, 也没有对其后续生命周期进行管理, 那么外观必须完成此类工作。

 3.如果要充分发挥这一模式的优势, 你必须确保所有客户端代码仅通过外观来与子系统进行交互。 此后客户端代码将不会受到任何由子系统代码修改而造成的影响, 比如子系统升级后, 你只需修改外观中的代码即可。

 4.如果外观变得过于臃肿, 你可以考虑将其部分行为抽取为一个新的专用外观类。

 

外观模式优缺点

 ✔️​你可以让自己的代码独立于复杂子系统。

 ❌外观可能成为与程序中所有类都耦合的上帝对象

 

更改后的项目:

在这里插入图片描述

代码:

//爆米花机
public class Popcorn {
    private static Popcorn instance = new Popcorn();

    public static Popcorn getInstance(){
        return instance;
    }

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

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

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

//机顶盒
public class BoxPlayer {
    private static BoxPlayer instance = new BoxPlayer();
    
    public static BoxPlayer getInstance(){
        return instance;
    }
    
    public void on(){
        System.out.println("机顶盒 开机");
    }
    
    public void off(){
        System.out.println("机顶盒关机");
    }
    
     public void play(){
         System.out.println("机顶盒播放");
     }
}

//投影仪
public class Projector {
    private static Projector instance = new Projector();

    public static Projector getInstance(){
        return instance;
    }

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

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

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

//灯
public class Light {
    private static Light instance = new Light();

    public static Light getInstance() {
        return instance;
    }

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

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

    public void dim(){
        System.out.println("灯光调暗");
    }

    public void bright(){
        System.out.println("灯光变亮");
    }
}
public class HomeTheaterFacade {
    //定义各个子系统对象
    private Popcorn popcorn;
    private BoxPlayer boxPlayer;
    private Projector projector;
    private Light light;

    //构造方法
    public HomeTheaterFacade(){
        super();
        this.popcorn = Popcorn.getInstance();
        this.boxPlayer = BoxPlayer.getInstance();
        this.projector = Projector.getInstance();
        this.light = Light.getInstance();
    }

    public void ready(){
        popcorn.on();
        boxPlayer.on();
        projector.on();
        light.on();
    }

    public void play(){
        light.dim();
        projector.focus();
        boxPlayer.play();
    }
    
    public void end(){
        light.bright();
        popcorn.off();
        projector.off();
        boxPlayer.off();
    }
}
public class Client {
    public static void main(String[] args) {
        HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();

        homeTheaterFacade.ready();

        homeTheaterFacade.play();

        homeTheaterFacade.end();
    }
}

 

外观模式的注意事项和细节

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值