首页 > 其他分享 >【设计模式#1】Facade设计模式(外观设计模式)的简单理解

【设计模式#1】Facade设计模式(外观设计模式)的简单理解

时间:2024-08-07 10:17:52浏览次数:14  
标签:void System class println Facade 设计模式 out public 外观设计

最近接手了一个需要重构的老项目,里面大量使用了Facade设计模式来整合各个子系统的功能,故简单梳理学习一下该设计模式的概念。
外观模式(Facade Pattern)是一种结构型设计模式,它通过为复杂子系统提供一个简单的接口,从而简化客户端与子系统的交互。为了更好地理解这一模式,我们可以举一个日常生活中的例子:家庭影院系统

家庭影院系统的外观模式

假设你有一个复杂的家庭影院系统,包含以下设备:

  1. DVD播放器
  2. 投影仪
  3. 环绕音响系统
  4. 窗帘控制系统
  5. 灯光控制系统

每次你要看电影时,需要执行一系列操作:

  1. 打开窗帘
  2. 关闭灯光
  3. 打开投影仪
  4. 打开DVD播放器
  5. 打开环绕音响系统
  6. 播放电影

如果没有外观模式,你需要一个一个地控制这些设备,这显然很繁琐。下面通过Java代码来展示如何使用外观模式简化这些操作。

没有外观模式的实现

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

class Projector {
    public void on() {
        System.out.println("Projector on");
    }
}

class SurroundSoundSystem {
    public void on() {
        System.out.println("Surround Sound System on");
    }
}

class CurtainControl {
    public void open() {
        System.out.println("Curtain opening");
    }
}

class LightControl {
    public void off() {
        System.out.println("Lights off");
    }
}

public class HomeTheaterWithoutFacade {
    public static void main(String[] args) {
        DVDPlayer dvdPlayer = new DVDPlayer();
        Projector projector = new Projector();
        SurroundSoundSystem soundSystem = new SurroundSoundSystem();
        CurtainControl curtainControl = new CurtainControl();
        LightControl lightControl = new LightControl();

        curtainControl.open();
        lightControl.off();
        projector.on();
        dvdPlayer.on();
        soundSystem.on();
        dvdPlayer.play();
    }
}

使用外观模式的实现

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

class Projector {
    public void on() {
        System.out.println("Projector on");
    }
}

class SurroundSoundSystem {
    public void on() {
        System.out.println("Surround Sound System on");
    }
}

class CurtainControl {
    public void open() {
        System.out.println("Curtain opening");
    }
}

class LightControl {
    public void off() {
        System.out.println("Lights off");
    }
}

// 外观类
class HomeTheaterFacade {
    private DVDPlayer dvdPlayer;
    private Projector projector;
    private SurroundSoundSystem soundSystem;
    private CurtainControl curtainControl;
    private LightControl lightControl;

    public HomeTheaterFacade(DVDPlayer dvdPlayer, Projector projector, SurroundSoundSystem soundSystem, CurtainControl curtainControl, LightControl lightControl) {
        this.dvdPlayer = dvdPlayer;
        this.projector = projector;
        this.soundSystem = soundSystem;
        this.curtainControl = curtainControl;
        this.lightControl = lightControl;
    }

    public void watchMovie() {
        curtainControl.open();
        lightControl.off();
        projector.on();
        dvdPlayer.on();
        soundSystem.on();
        dvdPlayer.play();
    }
}

public class HomeTheaterWithFacade {
    public static void main(String[] args) {
        DVDPlayer dvdPlayer = new DVDPlayer();
        Projector projector = new Projector();
        SurroundSoundSystem soundSystem = new SurroundSoundSystem();
        CurtainControl curtainControl = new CurtainControl();
        LightControl lightControl = new LightControl();

        HomeTheaterFacade homeTheater = new HomeTheaterFacade(dvdPlayer, projector, soundSystem, curtainControl, lightControl);
        homeTheater.watchMovie();
    }
}

解释

在没有使用外观模式的情况下,客户端代码(HomeTheaterWithoutFacade类中的main方法)需要直接与各个子系统进行交互,这使得代码变得复杂且难以维护。

使用外观模式后,客户端代码(HomeTheaterWithFacade类中的main方法)只需要与外观类(HomeTheaterFacade)交互。外观类封装了子系统的复杂性,提供了一个简单的接口(watchMovie方法),从而简化了客户端的操作。这不仅使代码更简洁,还提高了可维护性。

总的来说:外观设计模式所提出的“外观类”的核心思想是将一系列要与复杂系统做的交互提前封装为对应的行为,这样用户就只需要与各式各样的行为进行交互即可,由此屏蔽了系统的复杂性

以上

标签:void,System,class,println,Facade,设计模式,out,public,外观设计
From: https://www.cnblogs.com/DAYceng/p/18346484

相关文章

  • 深入解析:23种软件设计模式详解及其分类(创建型、结构型、行为型)附代码示例DEMO
    目录引言一、创建型模式1.简单工厂模式(SimpleFactoryPattern)2.抽象工厂模式(AbstractFactoryPattern)3.单例模式(SingletonPattern)4.建造者模式(BuilderPattern)5.原型模式(PrototypePattern)二、结构型模式1.适配器模式(AdapterPattern)2.桥接模式(BridgePatt......
  • 设计模式实战:在线教育系统的设计与实现
    问题描述设计一个在线教育系统,支持课程选择、支付流程和用户身份验证。系统需要确保功能的灵活性和可扩展性。设计分析策略模式策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。在线教育系统需要支持不同的支付方式(如信用卡支付、PayPal支付),使用策略模式......
  • 设计模式中的类关系
    1.依赖(Dependency)定义:一个类使用到另一个类的实例,通常是通过方法参数、局部变量等。依赖关系是最弱的关系,因为它仅仅表示类之间的临时关联。特征:在UML图中,依赖关系用带箭头的虚线表示,箭头指向被依赖的类。示例:publicclassDriver{  publicvoiddrive(Carcar){......
  • 设计模式图汇
    模板模式简单工厂模式工厂模式原型模式建造者模式策略模式观察者模式装饰模式单件模式外观模式命令模式组合模式状态模式享元模式代理模式/适配器模式桥接模式中介模式......
  • 设计模式 - Singleton pattern 单例模式
    文章目录定义单例模式的实现构成构成UML图单例模式的六种实现懒汉式-线程不安全懒汉式-线程安全饿汉式-线程安全双重校验锁-线程安全静态内部类实现枚举实现总结其他设计模式文章:最后定义单例模式是一种创建型设计模式,它用来保证一个类只有一个实例,并且提供一个......
  • 程序员进阶架构知识体系、开发运维工具使用、Java体系知识扩展、前后端分离流程详解、
    场景作为一名开发者,势必经历过从入门到自学、从基础到进阶、从学习到强化的过程。当经历过几年企业级开发的磨炼,再回头看之前的开发过程、成长阶段发现确实是走了好多的弯路。作为一名终身学习的信奉者,秉承持续学习、持续优化的信念。不惜耗费无数个日日夜夜,耗费大量时间精力......
  • 单例设计模式的懒汉式和饿汉式以及它们的区别
    单例模式:也叫单子模式,属于“创建模式”一个类只有一个实例,并且自行实例化并向整个系统提供这个实例,这个类称为单例类。单例类一个最重要的特点:类的构造方法是私有的。何时使用:系统全局有且只有一个实例。单例模式的懒汉式:publicclassSingle{//需要将变量定义成......
  • 从扫描的 pdf 中提取设计模式
    我有一份大约650页的扫描版pdf。每页都包含一些图案(花朵、几何图案等)。我的目标是从pdf中提取这些模式。供您参考,这是pdf中的一页我当前的解决方案涉及使用opencv检测轮廓并提取图案。但是,该解决方案并不能处理所有情况。该pdf每页包含不同数量的图像,并且......
  • 设计模式-适配器模式( Adapter Pattern)
    设计模式-适配器模式(AdapterPattern)  概要   记忆关键词:转换,兼容接口  定义:将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。  分析:在适配器模式中,Cilent调用Adapter以获得相应功能,Adapter扩......
  • 设计模式-外观模式(Facade)
    设计模式-外观模式(Facade)  概要   记忆关键词:对外统一接口  定义:为了是复杂的子系统更容易被使用,应当为子系统的众多接口提供一个简洁的高层接口。  分析:外观模式是一种结构型模式,它为子系统的众多接口提供了统一的高层接口,是子系统更容易使用。  外观模式结......