设计模式@第13章:外观模式

第13章:外观模式

13.1 影院管理项目

组建一个家庭影院:

DVD 播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,其过程为: 直接用遥控器:统筹各设备开关
开爆米花机
放下屏幕
开投影仪
开音响
开 DVD,选 dvd
去拿爆米花
调暗灯光
播放
观影结束后,关闭各种设备

二、传统方式解决影院管理

?

三、传统方式解决影院管理问题分析

  • 在 ClientTest 的 main 方法中,创建各个子系统的对象,并直接去调用子系统(对象)相关方法,会造成调用过程混乱,没有清晰的过程;
  • 不利于在 ClientTest 中,去维护对子系统的操作;
  • 解决思路:定义一个高层接口,给子系统中的一组接口提供一个一致的界面(比如在高层接口提供四个方法

ready, play, pause, end ),用来访问子系统中的一群接口

- 也就是说 就是通过定义一个一致的接口(界面类),用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节 => 外观模式**

四、外观模式基本介绍

  • 外观模式(Facade),也叫“过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用;
  • 外观模式通过定义一个一致的接口,用以==屏蔽内部子系统的细节==,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节;

五、外观模式原理类图

对类图说明(分类外观模式的角色)

  • 外观类(Facade): 为调用端提供统一的调用接口, 外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象
  • 调用者(Client): 外观接口的调用者
  • 子系统的集合:指模块或者子系统,处理 Facade 对象指派的任务,他是功能的实际提供者

六、外观模式解决影院管理

(一)传统方式解决影院管理说明

  • 外观模式可以理解为转换一群接口,客户只要调用一个接口,而不用调用多个接口才能达到目的。比如:在 pc 上安装软件的时候经常有一键安装选项(省去选择安装目录、安装的组件等等),还有就是手机的重启功能(把关机和启动合为一个操作)。
  • 外观模式就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用
  • 示意图说明

(二) 外观模式应用实例

  • 应用实例要求

    使用外观模式来完成家庭影院项目

  • 思路分析和图解(类图)

  • 代码实现

    具体的实体类:

package com.gjxaiou.facade;

public class DVDPlayer {

    //使用单例模式, 使用饿汉式
    private static DVDPlayer instance = new DVDPlayer();

    public static DVDPlayer getInstanc() {
        return instance;
    }

    public void on() {
        System.out.println(" dvd on ");
    }
    public void off() {
        System.out.println(" dvd off ");
    }

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

    //....
    public void pause() {
        System.out.println(" dvd pause ..");
    }
}

//-------------------------------------------
package com.gjxaiou.facade;

public class Popcorn {

    private static Popcorn instance = new Popcorn();

    public static Popcorn getInstance() {
        return instance;
    }

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

    public void off() {
        System.out.println(" popcorn ff ");
    }

    public void pop() {
        System.out.println(" popcorn is poping  ");
    }
}

//----------------------------------------------
package com.gjxaiou.facade;

public class Projector {

    private static Projector instance = new Projector();

    public static Projector getInstance() {
        return instance;
    }

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

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

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

    //...
}

//--------------------------------------------------
 package com.gjxaiou.facade;

public class Screen {

    private static Screen instance = new Screen();

    public static Screen getInstance() {
        return instance;
    }

    public void up() {
        System.out.println(" Screen up ");
    }

    public void down() {
        System.out.println(" Screen down ");
    }
}

//-----------------------------------------------------
package com.gjxaiou.facade;

public class Stereo {

    private static Stereo instance = new Stereo();

    public static Stereo getInstance() {
        return instance;
    }

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

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

    public void up() {
        System.out.println(" Stereo up.. ");
    }

    //...
}

//---------------------------------------------
package com.gjxaiou.facade;

public class TheaterLight {

    private static TheaterLight instance = new TheaterLight();

    public static TheaterLight getInstance() {
        return instance;
    }

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

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

    public void dim() {
        System.out.println(" TheaterLight dim.. ");
    }

    public void bright() {
        System.out.println(" TheaterLight bright.. ");
    }
}

中间的外观类:

package com.gjxaiou.facade;

public class HomeTheaterFacade {

    //定义各个子系统对象
    private TheaterLight theaterLight;
    private Popcorn popcorn;
    private Stereo stereo;
    private Projector projector;
    private Screen screen;
    private DVDPlayer dVDPlayer;

    //构造器
    public HomeTheaterFacade() {
        super();
        this.theaterLight = TheaterLight.getInstance();
        this.popcorn = Popcorn.getInstance();
        this.stereo = Stereo.getInstance();
        this.projector = Projector.getInstance();
        this.screen = Screen.getInstance();
        this.dVDPlayer = DVDPlayer.getInstanc();
    }

    //操作分成 4 步

    public void ready() {
        popcorn.on();
        popcorn.pop();
        screen.down();
        projector.on();
        stereo.on();
        dVDPlayer.on();
        theaterLight.dim();
    }

    public void play() {
        dVDPlayer.play();
    }

    public void pause() {
        dVDPlayer.pause();
    }

    public void end() {
        popcorn.off();
        theaterLight.bright();
        screen.up();
        projector.off();
        stereo.off();
        dVDPlayer.off();
    }
}

七、外观模式在 MyBatis 框架应用的源码分析

  • MyBatis 中的 Configuration 去创建 MetaObject 对象使用到外观模式
  • 代码分析+Debug 源码+示意图
  • 对源码中使用到的外观模式的角色类图

八、外观模式的注意事项和细节

  • 外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性
  • 外观模式对客户端与子系统的耦合关系 - 解耦,让子系统内部的模块更易维护和扩展
  • 通过合理的使用外观模式,可以帮我们更好的划分访问的层次
  • 当系统需要进行分层设计时,可以考虑使用 Facade 模式
  • 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个

Facade 类,来提供遗留系统的比较清晰简单的接口,让新系统与 Facade 类交互,提高复用性

  • 不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好。要以让系统有层次,利于维护为目的。

原文地址:https://www.cnblogs.com/qq438649499/p/12178320.html

时间: 2024-10-14 11:22:43

设计模式@第13章:外观模式的相关文章

设计模式(13)---外观模式

一.定义 外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 解释:简单来说,客户端需要调用一个特别复杂的子系统中的多个接口,如果直接调用逻辑处理起来会非常复杂,而且不便于系统扩展.外观模式把这个复杂的子系统统一起来,提供几个高层接口,以备客户端进行调用.通俗来说是:子系统是一个黑匣子,提供若干个透明接口以备调用. 二.UML类图及基本代码 基本代码: class Program { static void Main(string[]

设计模式之第7章-外观模式(Java实现)

设计模式之第7章-外观模式(Java实现) “鱼哥,知道怎么把大象装进冰箱里面么?”(作者按:这么简单的问题还想考我,早了几百年吧.)“把大象装进冰箱里,一共需要三步:第一步,把冰箱门打开:第二步,把大象装进去,第三步,把冰箱门关上.”(此处模仿本山老师语调,请自行脑补)“恭喜你,回答正确,那么问题来了,要是有一万个大象是不是要走3万步呢?如果有顺序错了是不是就无法正确的装进去了呢?”为了解决这个问题,我-外观模式也就应运而生了.(作者按:一句话都不让我接...) 外观模式之自我介绍 我呢,是一

第10章 外观模式(Fa?ade Pattern)

原文   第10章 外观模式(Fa?ade Pattern) 概述:   在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是要说的Fa?ade 模式. 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.[GOF <设计模式>] 结构图: 这里在附上一个有助于理解的图 未使用外观

Head First 设计模式之适配器模式与外观模式

Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计中将类的接口转化为想要的接口,以实现同的接口,此外还将讲述另一个模式,将对象包装起来以简化接口. 1.   适配器简介 1.1 面向对象的适配器 真实世界的适配器比如位于美式插头和欧式插座之间的交流电适配器.面向对象的适配器是什么呢? 面向对象的适配器是将一个接口转化成另一个接口,以符合客户的期望.

设计模式 8 —— 适配器和外观模式

设计模式目录: 设计模式 1 ——观察者模式 设计模式 2 —— 装饰者模式 设计模式 3 —— 迭代器和组合模式(迭代器) 设计模式 4 —— 迭代器和组合模式(组合) 设计模式 5 —— 工厂模式 设计模式 6 —— 单件模式 设计模式 7 —— 命令模式 设计模式 8 —— 适配器和外观模式 概述 第1部分 问题引入 第2部分 适配器模式定义 第3部分 对象和类的适配者 第4 部分 适配器模式与装饰者模式区别 第5 部分 外观模式 第1 部分 问题引入 OO适配器是什么,现实中到处都是.比

Java设计模式(五)外观模式 桥梁模式

(九)外观模式 外观模式为子系统提供一个接口,便于使用.解决了类与类之间关系的,外观模式将类之间的关系放在一个 Facade 类中,降低了类类之间的耦合度,该模式不涉及接口. class CPU { public void startup(){ System.out.println("cpu start"); } public void shutdown(){ System.out.println("cpu stop"); } } class Memory { pu

大话设计模式C++实现-第12章-外观模式

一.UML图 二.概念 外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 三.说明 Q:外观模式在什么时候使用呢? A:分为三个阶段: (1)首先,在设计初期阶段,应该要有意识的将不同的两个层分离. (2)第二,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时也会产生很多很小的类,这本是好事儿,但是也给外部调用他们的用户程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少他们之间的依赖

大话设计模式第十二章---外观模式PHP实现

<?php class Sub_system_one { public function method_one() { echo "subsystem one method one<br/>"; } } class Sub_system_two { public function method_two() { echo "subsystem one method two<br/>"; } } class Sub_system_three

【转】设计模式(九)外观模式Facade(结构型)

设计模式--外观模式Facade(结构型): 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇.一台空调和一台电视机的启动和关闭.该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计. 2. 问题 为了降低复杂性,常常将系统划分为若干个子系统.但是如何做到各个系统之间的通信和相互依赖关系达到最小呢? 3. 解决方案 外观模