java 设计模式之外观模式(十)

java 设计模式之外观模式⑩

什么是天才!我想,天才就是勤奋的结果。——郭沫若

设计模式学习,近期我会把23种设计模式都写成博客,敬请期待~
—2021/1/11

定义

外观模式也称之为过程模式,外观模式 通过定义一个对外开放的接口,用来屏蔽子类的细节(具体代码实现),使得调用端只需要和这个接口发生关系,而不需要关心子类细节(具体代码实现);

百度百科

使用场景

  • 设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
  • 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。

外观模式通俗的说就是’缓冲层’;

分析

UML类图(1.1):
在这里插入图片描述

UML类图(1.1)可见,在交互的时候客户端需要和每个功能交互

每个功能又有一定的联系,比如我打开电脑的同时可以打开空调,打电话的时候也可以看电视

这样的话交互起来不仅不利于管理,而且代码耦合性也特别高

这时候就用到了外观模式,往中间加一层’缓冲层’;

UML类图(1.2):
在这里插入图片描述
UML类图(1.2)可以看出,在客户端交互的时候只与缓冲层交互,不用关心各个子类的细节(具体实现代码),这就是外观模式

代码实现

AirConditioner 空调类

public class AirConditioner {
    
    

    private static AirConditioner instance = new AirConditioner();
    private AirConditioner(){
    
    }

    public static AirConditioner getInstance(){
    
    
        return  instance;
    }
    public void open(){
    
    
        Log.i("外观模式","打开了空调");
    }
    public void close(){
    
    
        Log.i("外观模式","关闭了空调");
    }
}

Phone手机类

public class Phone {
    
    
    private static Phone instance = new Phone();
    private Phone(){
    
    }

    public static Phone getInstance(){
    
    
        return  instance;
    }

    void open(){
    
    
        Log.i("外观模式","打开了手机");
    }

    public void close(){
    
    
        Log.i("外观模式","关闭了手机");
    }

    public void connectWiFi(){
    
    
        Log.i("外观模式","手机 连接了WiFi");
    }
}

Computer电脑类

public class Computer {
    
    
    private static Computer instance = new Computer();
    private Computer(){
    
    }

    public static Computer getInstance(){
    
    
        return  instance;
    }

    public void open(){
    
    
        Log.i("外观模式","打开了电脑");
    }

    public void close(){
    
    
        Log.i("外观模式","关闭了电脑");
    }
}

Television电视类

public class Television {
    
    
    private static Television instance = new Television();
    private Television(){
    
    }

    public static Television getInstance(){
    
    
        return  instance;
    }

    void open(){
    
    
        Log.i("外观模式","打开了电视");
    }

    void close(){
    
    
        Log.i("外观模式","关闭了电视");
    }
}

Facade缓冲层:

public class Facade {
    
    

    //空调
    private final AirConditioner airConditioner;
    //电脑
    private final Computer computer;
    //电视
    private final Television television;
    //手机
    private final Phone phone;

	//获取实例
    public Facade() {
    
    
        airConditioner = AirConditioner.getInstance();
        computer = Computer.getInstance();
        television = Television.getInstance();
        phone = Phone.getInstance();
    }

    //打开 空调 电脑 电视 手机
    public void open() {
    
    
        airConditioner.open();
        computer.open();
        television.open();
        phone.open();
    }

    //连接手机WIFI
    public void connectWiFi() {
    
    
        phone.connectWiFi();
    }

    public void close(){
    
    
        airConditioner.close();
        computer.close();
        television.close();
        phone.close();
    }
}

测试代码:

Facade facade = new Facade();

打开 空调 电脑 电视 手机
facade.open();
Log.i("外观模式","=====================");

//连接手机WIFI
facade.connectWiFi();

Log.i("外观模式","=====================");

facade.close();

Log图(2.1):
在这里插入图片描述
优点:

  • 外观模式对外观屏蔽了子系统的细节,因此降低了客户端对子系统使用的复杂性
  • 通过合理的使用外观模式,可以帮我们更好的划分层次
  • 实现了客户端与子系统的松耦合

切记:
不能为了使用外观模式而使用外观模式!如果说只有简单的两个类就没必要直接使用外观模式,直接调用即可,外观模式是用来解决稍微复杂的子类.要以利于维护为目的

完整代码

去设计模式/设计原则主页

原创不易,您的点赞就是对我最大的支持,记得点赞哦~

猜你喜欢

转载自blog.csdn.net/weixin_44819566/article/details/112476121