《设计模式》外观模式

简介: 《设计模式》外观模式

《设计模式》外观模式

定义

  • 外观模式(Facade) 也叫门面模式,该模式通过定义一个高层接口,为多个复杂的子系统提供一个一致性的访问接口,而使这些子系统更加容易使用
  • 一致性的访问接口旨在屏蔽子系统的细节,使得调用方只需要调用一致性的接口,而无需关心子系统的内部细节,降低应用程序的复杂度,提高可维护性。

外观模式的主要角色

  • 外观类(Facade):为多个子系统对外提供一个共同的接口。
  • 子系统集合:处理外观类对象指派的任务,是功能的实际提供方。
  • 外观模式的注意事项

外观模式对外屏蔽了子系统的内部细节,降低了客户端对子系统的使用复杂性。

当系统需要进行分层设计时,可以考虑使用外观模式。

当一个遗留的大型系统变得难以维护和扩展时,考虑为新系统开发一个 Facade 类,来提供遗留系统的清晰简单的接口,让新系统和 Facade 类交互,提高复用性。

合理使用外观模式,可以帮助更好的划分访问层次。

外观模式不符合开闭原则,修改起来比较麻烦。

外观模式的使用场景

在对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。

当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。

当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。

外观模式的原理类图如下所示

2e718f6de6d94987ae2f2182c528d9c8.png

案例背景:

小明的爷爷每天晚上睡觉前需要使用房间里不同电器的遥控器将空调、电视机、电灯、加湿器、自动化窗帘一个个关掉,每天早上醒来还需要将这些电器自动化设备一个个打开,爷爷感觉非常麻烦,因此孝顺的小明能帮他做一个工具,能够实现一键控制,打开或者关掉房间的这些设备。

小明设计的类图如下所示

2e718f6de6d94987ae2f2182c528d9c8.png

Client 类:

public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        System.out.println("----------每天早起第一件事:打开房间内的电器------------------");
        facade.turnOn();
        System.out.println("----------每天睡前最后一件事:关闭房间内的电器----------------");
        facade.turnOff();
    }
}

Facade 类:

public class Facade {
    private AirConditioner airConditioner;
    private TV tv;
    private Light light;
    private Humidifier humidifier;
    public Facade() {
        airConditioner = new AirConditioner();
        tv = new TV();
        light = new Light();
        humidifier = new Humidifier();
    }
    public void turnOn() {
        airConditioner.turnOn();
        tv.turnOn();
        light.turnOn();
        humidifier.turnOn();
    }
    public void turnOff() {
        airConditioner.turnOff();
        tv.turnOff();
        light.turnOff();
        humidifier.turnOff();
    }
}

AirConditioner 类:

public class AirConditioner {
    public void turnOn() {
        System.out.println("打开了空调....");
    }
    public void turnOff() {
        System.out.println("关闭了空调....");
    }
}

TV 类:

public class TV {
    public void turnOn() {
        System.out.println("打开了电视....");
    }
    public void turnOff() {
        System.out.println("关闭了电视....");
    }
}

Light 类:

public class Light {
    public void turnOn() {
        System.out.println("打开了电灯....");
    }
    public void turnOff() {
        System.out.println("关闭了电灯....");
    }
}

Humidifier 类:

public class Humidifier {
    public void turnOn() {
        System.out.println("打开了加湿器....");
    }
    public void turnOff() {
        System.out.println("关闭了加湿器....");
    }
}

外观模式在 Mybatis 框架中的应用

Configuration

public class Configuration {
  //...
  public MetaObject newMetaObject(Object object) {
    return MetaObject.forObject(object, this.objectFactory, this.objectWrapperFactory, this.reflectorFactory);
  }
  //...
}

MetaObject

public class MetaObject {
    private final Object originalObject;
    private final ObjectWrapper objectWrapper;
    private final ObjectFactory objectFactory;
    private final ObjectWrapperFactory objectWrapperFactory;
    private final ReflectorFactory reflectorFactory;
    private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
        this.originalObject = object;
        this.objectFactory = objectFactory;
        this.objectWrapperFactory = objectWrapperFactory;
        this.reflectorFactory = reflectorFactory;
        if (object instanceof ObjectWrapper) {
            this.objectWrapper = (ObjectWrapper)object;
        } else if (objectWrapperFactory.hasWrapperFor(object)) {
            this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);
        } else if (object instanceof Map) {
            this.objectWrapper = new MapWrapper(this, (Map)object);
        } else if (object instanceof Collection) {
            this.objectWrapper = new CollectionWrapper(this, (Collection)object);
        } else {
            this.objectWrapper = new BeanWrapper(this, object);
        }
    }
    public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
        return object == null ? SystemMetaObject.NULL_META_OBJECT : new MetaObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
    }
    //...
}

角色类图如下所示

2e718f6de6d94987ae2f2182c528d9c8.png


相关文章
|
8月前
|
设计模式 API 数据安全/隐私保护
探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密
外观模式是一种关键的设计模式,旨在通过提供一个简洁的接口来简化复杂子系统的访问。其核心价值在于将复杂的内部实现细节封装起来,仅通过一个统一的外观对象与客户端交互,从而降低了系统的使用难度和耦合度。在软件开发中,外观模式的重要性不言而喻。它不仅能够提高代码的可读性、可维护性和可扩展性,还能促进团队间的协作和沟通。此外,随着业务需求和技术的发展,外观模式能够适应变化,通过修改外观对象来灵活调整客户端与子系统之间的交互方式。总之,外观模式在软件设计中扮演着举足轻重的角色,是构建高效、稳定且易于维护的软件系统的关键
206 1
探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密
|
8月前
|
设计模式 Java
23种设计模式,外观模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】外观模式(Facade Pattern)是一种使用频率非常高的结构型设计模式,其核心思想是为子系统中的一组接口提供一个一致的界面。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。简而言之,外观模式就是客户端与复杂子系统之间的一个简单而统一的接口
94 3
|
8月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
80 1
|
9天前
|
设计模式 缓存 应用服务中间件
「全网最细 + 实战源码案例」设计模式——外观模式
外观模式(Facade Pattern)是一种结构型设计模式,旨在为复杂的子系统提供一个统一且简化的接口。通过封装多个子系统的复杂性,外观模式使外部调用更加简单、易用。例如,在智能家居系统中,外观类可以同时控制空调、灯光和电视的开关,而用户只需发出一个指令即可。
114 69
|
4月前
|
设计模式 Java
Java设计模式-外观模式(11)
Java设计模式-外观模式(11)
|
3月前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
39 0
|
5月前
|
设计模式 存储 Java
【九】设计模式~~~结构型模式~~~外观模式(Java)
文章详细介绍了外观模式(Facade Pattern),这是一种对象结构型模式,通过引入一个外观类来简化客户端与多个子系统之间的交互,降低系统的耦合度,并提供一个统一的高层接口来使用子系统。通过文件加密模块的实例,展示了外观模式的动机、定义、结构、优点、缺点以及适用场景,并讨论了如何通过引入抽象外观类来提高系统的可扩展性。
【九】设计模式~~~结构型模式~~~外观模式(Java)
|
8月前
|
设计模式
设计模式-外观模式
设计模式-外观模式
64 0
|
6月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 外观模式
js设计模式【详解】—— 外观模式
51 2
|
7月前
|
设计模式 Java
Java设计模式:外观模式之优雅门面(九)
Java设计模式:外观模式之优雅门面(九)