设计模式-外观模式

一、定义

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

外观模式其实和适配器模式很像,只不过适配器模式转化接口是为了实现接口的兼容,把每个接口都做了转化,而外观模式改变接口的原因是为了简化接口,把复杂的一切都隐藏,只对外暴露出一个干净的外观,而且外观模式不只是简单得简化解耦,也实现了将客户从众多子组件中解耦。

其实这个模式,我们在日常开发中会不自觉的使用的,比如有一个总览模块,总览模块的service层会调用其他模块的多个service接口,而只对总览模块的Controller层暴露出一个简单的接口。

二、实现

这个模式很简单,重要的是他背后的思想,以及实际开发中会不会主动想到并运用。

通过一个简单的家庭影院的例子来实现,开启家庭影院需要打开电视、开启音响、关闭窗帘、调暗电灯。

首先是各种设备类:

java 复制代码
public class Light {
    public void turnTo(int level){
        System.out.println("电灯调到" + level + "档");
    }
}

public class Curtain {
    public void open(){
        System.out.println("打开窗帘");
    }
    public void close(){
        System.out.println("关闭窗帘");
    }
}

public class Stereo {
    public void on(){
        System.out.println("打开音响");
    }
    public void off(){
        System.out.println("关闭音响");
    }
}

public class Television {
    public void on(){
        System.out.println("打开电视");
    }
    public void off(){
        System.out.println("关闭电视");
    }
}

实现外观模式类:

java 复制代码
public class HomeMovieFacade {
    private Light light;
    private Curtain curtain;
    private Stereo stereo;
    private Television television;

    public HomeMovieFacade(Light light, Curtain curtain, Stereo stereo, Television television) {
        this.light = light;
        this.curtain = curtain;
        this.stereo = stereo;
        this.television = television;
    }
    //开始观影模式
    public void beginMovie(){
        television.on();
        stereo.on();
        light.turnTo(1);
        curtain.close();
    }

    //结束观影模式
    public void endMovie(){
        television.off();
        stereo.off();
        light.turnTo(3);
        curtain.open();
    }
}

测试:

java 复制代码
public class FacadeTest {

    public static void main(String[] args) {
        testFacade();
    }

    static void testFacade(){
        HomeMovieFacade homeMovieFacade = new HomeMovieFacade(new Light(), new Curtain(), new Stereo(), new Television());
        homeMovieFacade.beginMovie();
        System.out.println("====结束=====");
        homeMovieFacade.endMovie();
    }
}
//输出
打开电视
打开音响
电灯调到1档
关闭窗帘
====结束=====
关闭电视
关闭音响
电灯调到3档
打开窗帘

三、"最少知识"原则

这个原则就是说要减少对象之间的交互,只留下几个"密友"。说白了,就是告诉我们在设计中,不要让过多的类耦合在一起。

这个原则也提供了一个方针供我们参考,就是在一个对象方法内,我们只应该调用属于下面范围的方法:

  • 该对象本身
  • 被当做方法的参数而传递进来的对象
  • 次方所创建活实例化的任何对象
  • 对象的任何组件

这个方针看起来比较严厉,但是确实可以帮助我们有效减少类的耦合。如果我们在一个方法中使用了另一个方法返回过来的对象中的方法,就相当于对另外一个对象的子组件发出了请求,增加了当前对象认识的对象数量。例如下面这个例子:

当然,实际开发中并不是非常死板的要求这样子做,需要根据实际情况灵活使用。

相关推荐
山沐与山6 小时前
【设计模式】Python模板方法模式:从入门到实战
python·设计模式·模板方法模式
阿拉斯攀登8 小时前
设计模式:责任链模式
设计模式·责任链模式
崎岖Qiu9 小时前
【设计模式笔记18】:并发安全与双重检查锁定的单例模式
java·笔记·单例模式·设计模式
阿闽ooo10 小时前
单例模式深度解析:从饿汉到懒汉的实战演进
开发语言·c++·笔记·设计模式
阿拉斯攀登10 小时前
设计模式:责任链模式(Spring Security)
设计模式·spring security·责任链模式
阿拉斯攀登10 小时前
设计模式:责任链模式(springmvc应用)
设计模式·springmvc·责任链模式
阿拉斯攀登11 小时前
设计模式:命令模式
设计模式·命令模式
阿闽ooo11 小时前
抽象工厂模式实战:用C++打造家具生产系统(附UML图与完整代码)
c++·设计模式·抽象工厂模式·uml
是店小二呀11 小时前
DanceGRPO+FLUX:多模态生成强化学习模型的高效
设计模式
明洞日记11 小时前
【设计模式手册022】抽象工厂模式 - 创建产品家族
java·设计模式·抽象工厂模式