外观模式 门面模式 Facade 创建型 设计模式(十三)

外观模式(FACADE)

又称为门面模式

意图

为子系统中的一组接口提供一个一致的界面

Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用。

意图解析

随着项目的持续发展,系统基本上都是会往功能更全面的方向发展,那么也就意味着我们的系统将会变得更加复杂。

系统会被划分为多个单独的子系统,每个子系统完成一部分功能,通过分工协作完成全部功能。

一个子系统也可能进一步拆分为更小的几个子系统。

程序中的文件将会越来越多,相互关联也会变得更加复杂

当使用一个功能的时候,作为客户端

你需要弄清楚相关类之间的关系,以及正确的调用顺序。

比如下图中

你需要自己识别有哪些子系统,涉及哪些相关的类和方法,你需要自己保证顺序(如果功能调用依赖顺序的话)

如同在医院里面,病人需要自己去排队挂号化验,跟每个流程的工作人员进行协作

如同在工厂里面,需要生产一个桌子,你亲自用机器生产桌子腿,自己使用机器生产桌面...

如同你去其他公司洽谈业务,你单独跟每个相关业务的人员进行联系沟通

你肯定想得到,如果有一个中间人为你代劳

不需要面对林林总总的子系统、部门、人员...

当你需要某种服务时,只需要告诉这个中间人就好了

这个想法就是外观模式

有了facade,你就不需要跟每个子系统进行单独的交流了

如同在医院里面,对于VIP,有专人代替你挂号.....

如同在工厂里面,有一个控制台机器,你选择产品,控制台下发命令安排其他的机器生产具体产品

如同你去其他公司洽谈业务,有一个接口人负责与你对接,他们那边的事情都通过这个人进行安排

外观模式的意图含义,如同他的名字一样,“建筑物的正面”

面对一个复杂的大楼,当你在正面远远望去,也就只能看到正面

在外观模式中,形容一个庞大的复杂的系统的一个直观的界面

借助于Facade模式

从原来的“客户端需要跟多个子系统进行交互”,转变为“只与Facade进行交互”

将客户端与子系统进行解耦,降低了耦合性,也降低了使用的复杂度

代码示例

“关好门窗,防火防盗”这句话有没有听过?

回想一下,当你早上准备出门离开家时,你会做什么?

假设你会关水、关灯、关门窗。

我们创建三个类,水 灯 窗,模拟离开家的场景

package facade;
public class Water {
public void turnOn() {
        System.out.println("打开水龙头...");
    }
    public void turnOff() {
        System.out.println("关闭水龙头...");
    }
}
package facade;
public class Light {
    public void turnOn() {
        System.out.println("开灯...");
    }
    public void turnOff() {
        System.out.println("关灯...");
    }
}
package facade;

public class Window {
    public void open() {
        System.out.println("开窗...");
    }
    public void close() {
        System.out.println("关窗...");
    }
}

测试代码

上面的测试代码Test作为客户端程序,可以看得出来,他直接跟Water Light Window三个类的对象进行交互

他需要调用相关的方法

也就是说Test 作为客户端对于“离家”这一系统的内部逻辑是了如指掌的--->需要断水、关灯、关窗

他也清楚每个类的方法

一方面增加了耦合性,另一方面将子系统的内部细节暴露出来

优化重构

试想下,如果你家是智能家居,有一个控制台Facade,或者说有一个手机App

他可以控制整个家庭的设备

package facade;

public class Facade {
    private Water water = new Water();
    private Light light = new Light();
    private Window window = new Window();

    public void leaveHome(){
        water.turnOff();
        light.turnOff();
        window.close();
    }

    public void backHome(){
        light.turnOn();
        window.open();
    }

}

通过这个控制台,客户端程序不再需要了解子系统的内部细节,他也不清楚每个类到底有哪些方法

所有的交互都是通过Facade来完成的

结构

Facade 外观角色

客户端调用角色,知晓子系统的所有功能与职责

通常,Facade会将所有的请求转发委派到子系统中去,也就是说该角色没有实际的业务、

SubSystem子系统角色

可以同时有一个或者多个子系统

注意   :子系统并不是说一个单独的类,而是一个类的集合,这些类根据逻辑功能点被组织在一起

子系统并不知道Facade的存在,对于子系统来说,Facade也就只是一个客户端程序

外观模式的结构比较简单,类似一个“封装”提取的过程

他的根本原则为迪米特法则,也就是“不要和陌生人说话”,尽可能少的与其他的对象进行交互

通过外观模式,做到了子系统只与外观对象交互

门面类个数

在门面模式中,通常只需要一个门面类,并且这个门面类只有一个实例

换句话说他很可能是一个单例

但是并不是说整个系统中只能有一个门面类

门面类的个数要根据系统中子系统的个数以及业务逻辑的情况

总结

当你需要为一个复杂的子系统提供一个简单的接口时或者希望子系统能够更加独立时,可以考虑使用外观模式

借助于外观模式,可以实现客户端与子系统的解耦,减少客户端对子系统的依赖性

一旦完成解耦,就意味着子系统有良好的独立性,也能拥有更好的扩展性

因为独立了,就意味着单独的子系统修改不会影响其他系统

而且,在多层次结构的系统中,可以使用Facade模式进行层与层之间的交互,将层与层之间的耦合性降低,使他们仅仅通过facade进行交互

总之一句话,降低了使用子系统的复杂程度,降低了耦合程度,满足迪米特法则----不要和陌生人说话

对客户端屏蔽了子系统的组件

仅仅通过Facade,大大减少了客户端所需要处理的对象的数目

对于外观模式,如果是子系统发生变化,Facade则极有可能需要面临修改,这不符合开闭原则

外观模式(门面模式)就如同我们开篇的图片一样,作为公司前台

接待来访宾客,一切事宜都有她来协调安排组织。

在OOP中,这个“前台”不仅是一个子系统的“正面”看到的样子,而且还强调了她的全权负责

她提供所有的业务需要的相关方法,尽管内部调用都是子系统中的方法,她提供简单一致的交流沟通形式

理解了迪米特法则,那么就比较容易理解外观模式

外观模式重点在于提供一个“简化”“封装”后的操作控制台,让你更容易操作整个系统,他几乎不会涉及子系统的内部逻辑

否则,门面对象将与子系统的业务逻辑耦合,增加了耦合度。

原文地址:外观模式 门面模式 Facade 创建型 设计模式(十三)

原文地址:https://www.cnblogs.com/noteless/p/10058164.html

时间: 2024-11-09 09:00:05

外观模式 门面模式 Facade 创建型 设计模式(十三)的相关文章

[Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式

注:关乎对象的创建方式的设计模式就是"创建型设计模式"(creational design pattern) 1.1 抽象工厂模式 "抽象工厂模式"(Abstract Factory Pattern)用来创建复杂的对象,这种对象由许多小对象组成,而这些小对象都属于某个特定的"系列"(family). 比如说,在GUI 系统里可以设计"抽象控件工厂"(abstract widget factory),并设计三个"具体子

创建型设计模式总结(二)

上篇文章我们介绍了创建型设计模式的前三种:简单工厂模式.工厂方法模式和抽象工厂模式.这一篇文章,我们系统介绍一下其他的三种创建型设计模式:创建者模式.原型模式和单例模式. 一.创建者模式 创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象. 创建者模式通常包括如下几种角色: 1.建造者角色(Builder) 对复杂对象的

设计模式之:创建型设计模式(6种)

创建型设计模式有: 共6种 简单工厂模式(Simple Factory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 建造者模式(Builder) 原型模式(Prototype) 单例模式(Singleton) 简单工厂模式 功能:主要用于创建对象.新添加类时,不会影响以前的系统代码.核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果. 优点: 适用于不同情况创建不同的类时 缺点: 客户端必须要知

六种创建型设计模式的比较和总结

一.描述 创建型设计模式包括如下几个:简单工厂模式(Simple Factory).工厂方法模式(Factory Method).抽象工厂模式(Abstract Factory).创建者模式(Builder).原型模式(Prototype).单例模式(Singleton). 二.六种创建型设计模式的比较 简单工厂模式:简单工厂模式又叫静态工厂模式,它定义一个具体的工厂类来负责所有产品对象的创建,因此这个工厂类的职责过大,当客户端UI与某些产品的创建有不同的要求时,需要不断地修改工厂类,增加判断逻

创建型设计模式总结

创建型设计模式共有五种:单例模式,简单工厂模式,抽象工厂模式,建造者模式,原型模式. 单例模式:创建一个只能new一次的类,只要这个类的资源没有被释放,无法在被实例化.确保对象的唯一性. 简单工厂模式:一个抽象实现类,一个抽象工厂类,分别需要普通类继承于这两个类,使用的时候实例化抽象工厂类指定到实现类,调用工厂方法.在有新需求时只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改.不过这样在一定时间积累之后会让自己的代码过于沉重和复杂,当程序已经满足不了原有的需求时,改起来会很困难

创建型设计模式 之 原型模式

同为创建型模式的原型模式与单例模式是密不可分的,这也是最常用的设计模式之一. 原型模式是一种非常简单的设计模式.这里除了基本介绍和演示,还详细介绍了Java中原型模式的本质. 一.介绍 同样,先来看一下<研磨设计模式>的定义——用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式的本质——克隆生成对象. 那么原型模式是什么意思呢?说白了就是克隆自身.我们知道Java中没有引用这个概念,Java用变量名代表引用.像 Apple a = new Apple();我们知道,想要操

设计模式(五)创建者模式(Builder)-创建型

创建者模式Builder 创建者模式就是将一个复杂对象的构建和它的表示分离,使的同样的构建过程可以创建不同的表示,而在客户端不用知道对象的构建细节.当系统需要创建一组复杂的对象,而且这个复杂的对象组装起来比较麻烦时,就可以使用创建者模式. 将抽象工厂模式中的功能类全部抽取出来放到一个类中 工厂类就是只负责对象的创建,不负责对象的组装,通过Director类来进行组装, 抽象工厂模式和创建者模式很类似,只是创建者模式更进一步的实现了类的单一职责 创建者模式 创建者模式的实现原理 创建者模式实际上就

设计模式--结构模式--门面模式

一.基本概念 1.外观模式(Facade),也被称为"门面模式".定义了一个高层.统一的接口,外部通过这个统一的接口对子系统中的一群接口进行访问. 2.角色 A:外观(Facade)角色:为多个子系统对外提供一个共同的接口. B:子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它. C:客户(Client)角色:通过一个外观角色访问各个子系统的功能. 二.例子. 分诊台作为患者和医生的装饰. A:外观(Facade)角色: 1 package comm.

ANDROID 中设计模式的採用--创建型模式

 所谓模式就是在某一情景下解决某个问题的固定解决方式. 全部的创建型模式都是用作对象的创建或实例化的解决方式. 1 简单工厂模式 创建对象的最简单方法是使用new来创建一个对象,假设仅仅创建一种固定不变的对象,能够使用new来创建这个对象. 假设要依据不同场景创建不同类型的对象,就可能须要採用不同的方法,就出现了不同的模式的採用和总结. 如ANDROID的媒体框架中为了实现对不同媒体源的播放,就须要实现多种播放器对象,并可能须要依据支持的媒体类型的添加,不断加入播放器对象. sp<Media