首页 > 其他分享 >外观模式(Facade Pattern)

外观模式(Facade Pattern)

时间:2023-05-22 15:56:47浏览次数:50  
标签:外观 off Pattern void public lights Facade 子系统

一、模式动机

外观模式(Facade Pattern)是一种使用频率非常高的设计模式,它通过引入一个外观角色来简化客户端和子系统之间的操作为复杂的子系统调用提供一个统一的入口,使子系统与客户端的耦合度降低,且客户端调用非常方便。
外观模式中,外部与一个子系统的通信可以通过一个统一的外观对象进行。外观模式又称为“门面模式”。也是对象结构型模式之一。

  • 一个客户类需要和多个业务类交互,有时候这些需要交互的业务类会作为一个整体出现
  • 引入一个新的外观类(Facade)来负责和多个业务类【子系统(Subsystem)】进行交互,而客户类只需与外观类交互
  • 为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互
    • 没有外观类:每个客户类需要和多个子系统之间进行复杂的交互,系统的耦合度将很大
    • 引入外观类:客户类只需要直接与外观类交互,客户类与子系统之间原有的复杂引用关系由外观类来实现,从而降低了系统的耦合度功能
      image

二、模式定义

  • 外观模式(Facade Pattern):外部与子系统的通信通过一个统一的外观对象进行,为子系统中的一组接口提供一个统一的入口
  • 外观模式定义了一个高层接口,这个接口使得子系统更加容易使用
  • 外观模式又称为门面模式,它是一种对象结构型模式

三、模式结构

image

四、案例实现

案例背景

电源开关,可以控制电灯,风扇,空调和电视机的关闭

案例结构

image

代码实现

public class Light {

    private String position;

    public Light(String position) {
        this.position = position;
    }

    public void on(){
        System.out.println(this.position+"开灯");
    }
    public void off(){
        System.out.println(this.position+"关灯");
    }
}

电视

public class Television {

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

}

空调

public class AirConditioner {

    public void on(){
        System.out.println("开空调");
    }
    public void off(){
        System.out.println("关空调");
    }

}

风扇

public class Fan {

    public void on(){
        System.out.println("开风扇");
    }
    public void off(){
        System.out.println("关风扇");
    }

}

开关

public class SwitchFacade {

    private Light lights[] = new Light[4];
    private Fan fan;
    private AirConditioner airConditioner;
    private Television television;

    public SwitchFacade() {

        lights[0] = new Light("左前");
        lights[1] = new Light("左后");
        lights[2] = new Light("右前");
        lights[3] = new Light("右后");

        fan = new Fan();
        airConditioner = new AirConditioner();
        television = new Television();
    }

    public void on(){
        lights[0].on();
        lights[1].on();
        lights[2].on();
        lights[3].on();
        fan.on();
        airConditioner.on();
        television.on();
    }

    public void off(){
        lights[0].off();
        lights[1].off();
        lights[2].off();
        lights[3].off();
        fan.off();
        airConditioner.off();
        television.off();
    }
}

客户测试类

public class Client {

    public static void main(String[] args) {
        SwitchFacade switchFacade = new SwitchFacade();
        switchFacade.on();
        System.out.println("-------------------------------");
        switchFacade.off();
    }

}

运行结果

image

案例分析

开关类中关联子系统类,开关类中的方法是调用子系统的方法,如果要增加新的子系统,需要引进抽象外观类

五、模式分析

  • 是迪米特法则的一种具体实现
  • 通过引入一个新的外观角色来降低原有系统的复杂度,同时降低客户类与子系统的耦合度
  • 所指的子系统是一个广义的概念,它可以是一个类、一个功能模块、系统的一个组成部分或者一个完整的系统

六、总结

模式优点

  • 它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易
  • 它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可
  • 一个子系统的修改对其他子系统没有任何影响,而且子系统的内部变化也不会影响到外观对象

模式缺点

  • 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性
  • 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则

使用情形

  • 要为访问一系列复杂的子系统提供一个简单入口
  • 客户端程序与多个子系统之间存在很大的依赖性
  • 层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而是通过外观类建立联系,降低层之间的耦合度

标签:外观,off,Pattern,void,public,lights,Facade,子系统
From: https://www.cnblogs.com/sorrymine/p/17420823.html

相关文章

  • 原型模式(Prototype Pattern)
    原型模式(PrototypePattern)一、意图用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。二、优缺点优点:1、性能提高。2、逃避构造函数的约束。缺点:1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个......
  • 桥接模式(Bridge Pattern)
    模式动机桥接模式(BridgePattern)是一种很实用的结构型模式,如果系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使得两者可以独立扩展。桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多重继承,将类之间的静态继承关系转换为动态的......
  • 多机型手机外观清洁与检测设备设计
    随着德国“工业4.0”和美国“工业互联网”的发展,我们国家也提出了“中国制造2025”应对第四次工业革命[14]。“中国制造2025”的首要目标就是智能制造,而智能制造就必须结合高度自动化、高度数字化和高度网络化等,未来中国将在自动化生产和视觉检测行业迎来快速的发展......
  • cpp: Facade Pattern
     /*****************************************************************//***\fileGoldGraphic.h*\briefFacadePattern外观模式*涂聚文GeovinDuVisualStudio2022edit.*\authorgeovindu*\dateMay2023*************************************......
  • cpp: Singleton Pattern
     //GoldConfig.h:此文件包含"GoldConfig"类。装饰器模式SingletonPatternC++14////SingletonPattern单例模式单件模式、Singleton//2023年5月20日涂聚文GeovinDuVisualStudio2022edit.#pragmaonce#ifndefGOLDCONFIG_H#defineGOLDCONFIG_H#i......
  • 从零玩转设计模式之外观模式-waiguanmos
    title:从零玩转设计模式之外观模式date:2022-12-1215:49:05.322updated:2022-12-2315:34:40.394url:https://www.yby6.com/archives/waiguanmoscategories:-设计模式tags:-设计模式什么是外观模式外观模式是一种软件设计模式,它提供了一种将多个子系统包装在一......
  • Java设计模式-外观模式
    简介在软件开发过程中,经常会遇到复杂的系统和庞大的类库。这些系统往往包含了大量的类和子系统,给开发人员带来了挑战。为了简化接口设计和提高系统的可用性,设计模式提供了一种名为外观模式的解决方案。外观模式是一种结构型设计模式,旨在为复杂系统提供一个简化的接口。该模式通......
  • 模板模式(Template Pattern)
    模板模式一、介绍  模板模式(TemplatePattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方式使......
  • 组合模式(Composite Pattern)
    组合模式一、概述  组合模式(CompositePattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。二、介绍......
  • 策略模式(Strategy Pattern)
    策略模式一、介绍  在策略模式(StrategyPattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。意图:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。主要解决:在有多种算法相似的情况下,使用if...else所带来的复杂和难以维护......