技术成神之路:设计模式(二十一)外观模式

相关文章:技术成神之路:二十三种设计模式(导航页)

介绍

外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供一个统一的接口。外观模式定义了一个高层接口,使得子系统更容易使用。

1. 定义


外观模式通过引入一个外观类,来简化与复杂系统的交互。这个外观类对外提供一个简单接口,而系统内部的复杂性被封装在外观类后面。

2. 主要作用


  • 简化接口: 为子系统提供一个简单的接口,降低使用难度。
  • 解耦子系统: 让客户端不需要了解子系统的复杂实现,减少客户端与子系统之间的依赖。
  • 提高灵活性和扩展性: 通过外观模式实现系统的模块化,使得系统更易于扩展和维护。

3. 解决的问题


外观模式主要用来解决复杂系统的使用难题。通过提供一个统一的接口,隐藏系统的复杂性,使得客户端可以更简单地进行操作。

4. 模式原理


包含角色:

  1. 外观角色(Facade):定义了一个高层接口,提供与多个子系统的交互方法。
  2. 子系统角色(Subsystem Classes):各个子系统实现具体的功能,外观类通过这些子系统来完成用户的请求。

UML类图:

代码示例:

java 复制代码
// 子系统类
class Computer {
    public void start() {
        System.out.println("Computer starting...");
    }
    public void shutdown() {
        System.out.println("Computer shutting down...");
    }
}

class Monitor {
    public void turnOn() {
        System.out.println("Monitor turning on...");
    }
    public void turnOff() {
        System.out.println("Monitor turning off...");
    }
}

class Keyboard {
    public void connect() {
        System.out.println("Keyboard connected.");
    }
    public void disconnect() {
        System.out.println("Keyboard disconnected.");
    }
}

// 外观类
class ComputerFacade {
    private Computer computer;
    private Monitor monitor;
    private Keyboard keyboard;

    public ComputerFacade() {
        this.computer = new Computer();
        this.monitor = new Monitor();
        this.keyboard = new Keyboard();
    }

    public void start() {
        keyboard.connect();
        monitor.turnOn();
        computer.start();
    }

    public void shutdown() {
        computer.shutdown();
        monitor.turnOff();
        keyboard.disconnect();
    }
}

调用.

java 复制代码
public class FacadePatternDemo {
    public static void main(String[] args) {
        ComputerFacade computerFacade = new ComputerFacade();
        
        // 启动计算机
        computerFacade.start();
        
        // 关闭计算机
        computerFacade.shutdown();
    }
}

打印输出

c 复制代码
Lights turned on
Engine started
Music playing
Music stopped
Engine stopped
Lights turned off

外观模式挺容易理解的,原理也很简单,像不像Java封装,把细节封装在类的内部,只给外部提供想给他的接口调用。

不知道你在开发中有没有注意,我们所使用到的大部分三方库,都通过提供一个管理类来简化用户的调用过程,其内部复杂的细节让用户感知不到,总之就是让用户用起来方便,一个字 "爽"!其原理也是运用了外观模式(Facade Pattern)的原则。所以说,如果你要开发第三方库,设计模式的运用是必不可少的,是基础也是灵魂。

经典案例:

在Java中,ApplicationContext 是一个外观类,提供了对不同Spring功能(如Bean管理、事务管理等)的简化访问。开发者可以通过它快速访问和管理Spring容器中的Beans,而不需要了解每个子系统的复杂性。

在安卓中,使用MediaPlayer播放音频时,开发者只需调用几个简单的方法,如setDataSource()prepare()start(),而不需要了解音频播放的底层实现。

5. 优缺点


优点

  • 简化使用:提供简单接口,降低学习成本。
  • 解耦合:降低客户端与子系统之间的耦合度。
  • 灵活性:方便对子系统进行修改和扩展。

缺点

  • 可能的性能问题:引入额外的调用可能增加性能开销。
  • 过度简化风险:可能导致系统功能细节的丢失。

6. 应用场景


  • 复杂系统:需要对外提供简单接口的复杂系统。
  • 第三方库使用:对复杂的第三方库进行封装。
  • 模块化开发:需要降低模块之间的依赖。

7. 总结


外观模式在简化复杂系统的使用和降低系统耦合度方面发挥了重要作用。通过提供一个高层接口,外观模式隐藏了复杂的实现细节,使得系统更加易于理解和使用。虽然存在一些潜在的性能问题,但在合理的应用场景下,外观模式能够显著提高系统的可维护性和灵活性。

相关推荐
workflower13 小时前
人形机器人灵巧手产业链
人工智能·设计模式·机器人·云计算·无人机
Java后端的Ai之路15 小时前
03、Python - 抽象工厂模式
开发语言·python·设计模式·抽象工厂模式·通用智慧
AI人工智能+电脑小能手19 小时前
大白话说Java设计模式-45-解释器模式(源码剖析篇)
java·设计模式·解释器模式·源码分析·pattern·spel·javacc
码匠许师傅1 天前
【设计模式精讲】4.单例模式(Singleton)
c++·单例模式·设计模式
雾削木1 天前
2026 编程领域热点知识速览:AI 辅助开发、设计模式实战与嵌入式高效迭代
人工智能·设计模式
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-42-访问者模式(业务实战篇)
java·spring·设计模式·访问者模式·asm·营销规则·数据结构与操作分离
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-43-访问者模式(源码剖析篇)
java·设计模式·访问者模式·源码分析·elementvisitor·asm classvisitor·spring spel
Michael_lcf3 天前
Agent设计模式:思考-行动-观察循环的本质与局限
设计模式·agent设计模式·agent设计模式的本质
丰锋ff3 天前
设计模式学习笔记
笔记·学习·设计模式
米啦啦.3 天前
设计模式/
观察者模式·单例模式·设计模式·工厂模式