GOF设计模式(10)外观模式

简介

一、定义

1、概念

  • 外观(Facade)模式:外部与一个子系统的通信通过一个统一的外观角色进行,为子系统中的一组接口提供一个一致的入口,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

2、理解

  • 外观类维护要用的子系统的引用,提供一个对外的统一的访问接口,在这个接口里对要用的子系统的接口方法进行调用;

二、组件

  • Facade(外观角色):在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。
  • SubSystem(子系统角色):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。

三、结构图

示例(电脑硬件系统)

一、子系统

public class CPU
{
    public static final Logger LOGGER = Logger.getLogger(CPU.class);
    public void start()
    {
        LOGGER.info("cpu is start...");
    }

    public void shutDown()
    {
        LOGGER.info("CPU is shutDown...");
    }
}

public class Disk
{
    public static final Logger LOGGER = Logger.getLogger(Disk.class);
    public void start()
    {
        LOGGER.info("Disk is start...");
    }

    public void shutDown()
    {
        LOGGER.info("Disk is shutDown...");
    }
}

public class Memory
{
    public static final Logger LOGGER = Logger.getLogger(Memory.class);
    public void start()
    {
        LOGGER.info("Memory is start...");
    }

    public void shutDown()
    {
        LOGGER.info("Memory is shutDown...");
    }
}

二、外观类

public class Computer
{
    public static final Logger LOGGER = Logger.getLogger(Computer.class);

    private CPU cpu;
    private Memory memory;
    private Disk disk;
    public Computer()
    {
        cpu = new CPU();
        memory = new Memory();
        disk = new Disk();
    }
    public void start()
    {
        LOGGER.info("Computer start begin");
        cpu.start();
        disk.start();
        memory.start();
        LOGGER.info("Computer start end");
    }

    public void shutDown()
    {
        LOGGER.info("Computer shutDown begin");
        cpu.shutDown();
        disk.shutDown();
        memory.shutDown();
        LOGGER.info("Computer shutDown end...");
    }
}

三、客户端

public class Cilent {
    public static final Logger LOGGER = Logger.getLogger(Cilent.class);
    public static void main(String[] args)
    {
        Computer computer = new Computer();
        computer.start();
        LOGGER.info("=================");
        computer.shutDown();
    }

}

总结

一、优点

  • 对客户端屏蔽了子系统组件,减少了客户端需要处理的对象数量并且使得子系统使用起来更加容易。
  • 实现了子系统与客户端之间松耦合。
  • 提供了一个访问子系统的统一入口,并不影响客户端直接使用子系统。

二、使用场景

  • 想要为访问一系列复杂的子系统提供一个统一的简单入口
  • 客户端与多个子系统之间存在很大的依赖性,引入外观类可以将子系统和客户端解耦
  • 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系

三、外观模式优化

  • 如何在不修改源代码的基础之上使用新的外观类呢?
  • 解决办法是:引入一个新的抽象外观类,客户端只针对抽象编程,而在运行时再确定具体外观类

原文地址:https://www.cnblogs.com/stanwuc/p/10906941.html

时间: 2024-11-02 01:18:23

GOF设计模式(10)外观模式的相关文章

设计模式(10) 外观模式(FACADE)

问题聚焦: 设计一个系统时,比较常见的做法是将它划分为若干个小的系统,互相协作,组成一个大的系统. 那么,在设计这些小系统时,需要注意一些什么呢? 外观模式为什么可以让子系统更加容易的使用呢?(最小化子系统之间的通信和相互依赖关系,即降低耦合度) 意图: 为子系统中的一组接口提供一个一致的界面.Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 动机: 将一个系统划分为若干个子系统有利于降低系统的复杂性. 一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小. 达到该

设计模式-10外观模式(Facade Pattern)

1.模式动机 在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了. 软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂.这时如果系统内部发生改变,客户端也要跟着改变,这违背了"开闭原则",也违背了"迪米特法则(最少知道原则)",所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标. 2.模式定义 外观模式(F

设计模式之外观模式(Facade)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

【设计模式】外观模式

外观模式:它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用.这其实就是一个分层的思想,将较低层复杂的操作交由较高层同一管理,并向用户程序提供简单易用的接口.下面是一个用C++编写的外观模式的例子. #include <iostream> #include <string> using namespace std; // 键盘类 class Keyboard { public: string Type(const string &input) { retur

如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往文中插入几个表情的趋势了, 但是你真的插的姿势对了吗?这种事情不是随便插的,来来来,给你 见识下如何在适当的场景插入适当的表情以让读者感觉到易可赛艇, 本文以讲故事插表情为主,讲述桥接模式为辅,多图预警, 简书上排版可能有些问题,最佳排版可见: https://www.zybuluo.com/coder-pig/note

【设计模式】——外观模式

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式结构图: 代码模板: //四个子系统的类class SubSystemOne{public:    void MethodOne()    {        cout << "子系统方法一" << endl;    }};class SubSystemTwo{public:    void MethodTwo()    {  

设计模式之外观模式(九)

设计模式之外观模式 一.引言 当一个复杂的系统由多个复杂的子系统构成,然后客户端调用会调用多个子系统.这时,客户端会和多个子系统耦合在一起,当子系统需要扩展或者改变时,客户端也要随之改变,我们可以使用外观模式将客户端和子系统进行解耦. 二.介绍 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口. 何时使用: 1.客户端不需要知道系统内部的复杂联系,整个系统只需提供

C#设计模式(11)——外观模式(Facade Pattern)

一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 "门面"模式.下面就具体介绍下外观模式. 二.外观模式的详细介绍 2.1 定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内

java设计模式 GOF23 10 外观模式

一.外观模式简介 外观模式是为了解决类与类之间的依赖关系,这种模式将类与类之间的关系放到一个Facade类中,从而降低类与类之间的耦合. 二.简单代码实现 package com.lz.facade; /* * 外观模式 * 门面对象 */ public class RegisterFacade { public void register() { new 南京工商局().checkName(); new 南京税务局().taxCertificata(); } } package com.lz.

java设计模式之外观模式(门面模式)

针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下. 一.概念介绍 外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.这种类型的设计模式属于结构性模式.为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用. 二.角色及使用场景 简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用.这个模式中,设计到3个角色. 1).门面角色:外观模式的核心.它被客户角色调用,它熟悉子系统的功