23种设计模式——外观模式(Facade Pattern)详解

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。

🍎个人主页:Meteors.的博客
💞当前专栏:设计模式
✨特色专栏:知识分享
🥭本文内容:23种设计模式------外观模式(Facade Pattern)
📚 ** ps ** :阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出


目录

[一. 背景](#一. 背景)

[二. 简介](#二. 简介)

[三. 核心思想](#三. 核心思想)

[四. 适用场景](#四. 适用场景)

[五. 代码示例](#五. 代码示例)

[六. 优化方式](#六. 优化方式)

[七 总结](#七 总结)


一. 背景

外观模式的特点光听这个名字可能有些难理解,可以理解为它就是给一些封装好的内部类一个外部的外观(多对一),作用就像向对象的三大特性之一的封闭性一样,防止内部元素对外展示。用设计模式的设计原则来看,它满足了两个设计原则,迪米特法则 外观模式让客户端只与外观类打交道,而不需要了解复杂的子系统内部多个类,减少了对象之间的依赖,符合"只与直接朋友通信"的原则 单一职责原则 外观类负责简化接口,子系统类各自负责自己的业务,职责更单一 **),**下面内容会对它进行详细的介绍。​


二. 简介

Facade Pattern(外观模式)是23种设计模式中的一种结构型模式,它为复杂的子系统提供了一个简单的接口。外观模式隐藏了子系统的复杂性,为客户端提供了一个统一的访问接口,使得客户端更容易使用子系统。


三. 核心思想

外观模式通过创建一个外观类 ,将子系统的复杂性封装在这个外观类中,客户端只需要与外观类交互,而不需要直接与子系统的各个组件交互。这样可以降低客户端与子系统之间的耦合度, 提高系统的可维护性和可扩展性。


四. 适用场景

  • 客户端需要使用一个复杂的子系统时,可以使用外观模式简化客户端的使用。
  • 当需要为复杂的子系统提供一个简单的接口时,可以使用外观模式。
  • 当需要将客户端与子系统解耦时,可以使用外观模式

五. 代码示例

下面是一个简单的外观模式的代码案例,以一个家庭影院系统为例:

java 复制代码
// 子系统:DVD播放器
class DvdPlayer {
    public void on() {
        System.out.println("DVD Player is on");
    }

    public void play() {
        System.out.println("DVD Player is playing");
    }

    public void off() {
        System.out.println("DVD Player is off");
    }
}

// 子系统:投影仪
class Projector {
    public void on() {
        System.out.println("Projector is on");
    }

    public void setInput(String input) {
        System.out.println("Projector input is set to " + input);
    }

    public void off() {
        System.out.println("Projector is off");
    }
}

// 子系统:音响系统
class SoundSystem {
    public void on() {
        System.out.println("Sound System is on");
    }

    public void setVolume(int volume) {
        System.out.println("Sound System volume is set to " + volume);
    }

    public void off() {
        System.out.println("Sound System is off");
    }
}

// 外观类:家庭影院外观
class HomeTheaterFacade {
    private DvdPlayer dvdPlayer;
    private Projector projector;
    private SoundSystem soundSystem;

    public HomeTheaterFacade(DvdPlayer dvdPlayer, Projector projector, SoundSystem soundSystem) {
        this.dvdPlayer = dvdPlayer;
        this.projector = projector;
        this.soundSystem = soundSystem;
    }

    public void watchMovie() {
        System.out.println("Get ready to watch a movie...");
        dvdPlayer.on();
        projector.on();
        projector.setInput("DVD");
        soundSystem.on();
        soundSystem.setVolume(10);
        dvdPlayer.play();
    }

    public void endMovie() {
        System.out.println("Shutting down the movie theater...");
        dvdPlayer.off();
        projector.off();
        soundSystem.off();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        DvdPlayer dvdPlayer = new DvdPlayer();
        Projector projector = new Projector();
        SoundSystem soundSystem = new SoundSystem();

        HomeTheaterFacade homeTheater = new HomeTheaterFacade(dvdPlayer, projector, soundSystem);

        homeTheater.watchMovie();
        System.out.println("--------------------");
        homeTheater.endMovie();
    }
}

六. 优化方式

  1. ***使用工厂方法创建外观对象:***可以通过工厂方法来创建外观对象,这样可以更好地管理外观对象的创建过程。
  2. ***抽象外观类:***可以创建一个抽象外观类,让不同的外观类继承这个抽象类,这样可以更好地扩展外观模式。
  3. ***外观模式与单例模式结合:***可以将外观类设计为单例模式,确保系统中只有一个外观实例。
  4. ***使用配置文件:***可以使用配置文件来指定外观类和子系统类的对应关系,这样可以更加灵活地配置系统。
  5. ***分层外观:***对于特别复杂的系统,可以设计多层外观,每一层负责一部分功能,这样可以更好地组织代码。

七 总结

外观模式是一种非常实用的设计模式,它可以简化复杂系统的使用,提高代码的可维护性和可扩展性。在实际开发中,当我们面对一个复杂的子系统时,可以考虑使用外观模式来封装子系统的复杂性,为客户端提供一个简单的接口。


最后,

其它设计模式会陆续更新,希望文章对你有所帮助!

相关推荐
胖虎13 小时前
iOS中的设计模式(九)- 外观模式 用外观模式点一份外卖:Swift 实战讲解
设计模式·外观模式
czy87874753 小时前
用C语言实现外观模式
c语言·外观模式
Asort5 小时前
JavaScript设计模式(十六)——迭代器模式:优雅遍历数据的艺术
前端·javascript·设计模式
昨天的猫5 小时前
原来我们写的单例还存在缺陷~~
设计模式
Tiny_React6 小时前
智能体设计模式-CH13:人类参与环节(Human-in-the-Loop)
设计模式
Tiny_React6 小时前
智能体设计模式-CH09:学习与适应(Learning and Adaptation)
设计模式
Tiny_React6 小时前
智能体设计模式-CH10:模型上下文协议(Model Context Protocol)
设计模式
Tiny_React6 小时前
智能体设计模式-CH11:目标设定与监控(Goal Setting and Monitoring)
设计模式
Deschen17 小时前
设计模式-外观模式
java·设计模式·外观模式