外观模式(Facade)

一、外观模式介绍

面向对象的一个比较重要的法则:迪米特法则(最少知识原则):一个软件实体应当尽可能少的与其他实体发生相互作用。

外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口。这个接口使得这一子系统更加容易使用。说白了,就可以理解为封装

外观模式的核心:为子系统提供统一的入口,封装子系统的复杂性,便于客户端调用

例1:股民炒股

未使用外观模式情况

要让股民尽可能少的与股票直接打交道,给其提供一个蒙面,让股民跟蒙面打交道。这样就符合了迪米特法则,让股民尽可能少的与股票打交道了。

增加了外观模式后的类图:

例2:客户喝茶,客户要尽可能少的与子系统(开水,茶具,茶叶...)打交道,提供一个服务员,统一了喝茶的入口。

例3:公司注册流程

未使用外观模式的注册流程

使用了外观模式后呢?也就是找个代理公司来帮我们做这些事

外观模式类结构图:

二、外观模式代码实现

外观模式代码实现

未使用外观模式情况下,代码如下

子系统代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package com.fz.facade;

/**

 * 所有子系统

 */

public class SubSystemClass {

    public void methodOne(){

        System.out.println("子系统方法1");

    }

}

class SubSystemClass2{

    public void methodTwo(){

        System.out.println("子系统方法2");

    }

}

class SubSystemClass3{

    public void methodThree(){

        System.out.println("子系统方法3");

    }

}

测试代码:


1

2

3

4

5

6

7

8

9

10

public static void main(String[] args) {

    //未使用外观模式情况

    SubSystemClass s1 = new SubSystemClass();

    SubSystemClass2 s2 = new SubSystemClass2();

    SubSystemClass3 s3 = new SubSystemClass3();

    s1.methodOne();

    s2.methodTwo();

    s3.methodThree();

    

}

增加外观模式后:新增一个Facade类


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

package com.fz.facade;

/**

 * 外观模式:封装子系统,对外提供一个门面方法

 */

public class Facade {

    //所有子系统的引用

    private SubSystemClass s1 = null;

    private SubSystemClass2 s2 = null;

    private SubSystemClass3 s3 = null;

    //构造子系统的引用

    public Facade() {

        this.s1 = new SubSystemClass();

        this.s2 = new SubSystemClass2();

        this.s3 = new SubSystemClass3();

    }

    /**

     * 具体的外观方法

     */

    public void facade(){

        s1.methodOne();

        s2.methodTwo();

        s3.methodThree();

    }

}

再次测试:


1

2

3

4

5

6

public static void main(String[] args) {       

    //使用了外观模式后

    System.out.println("-----------------------");

    Facade facade = new Facade();

    facade.facade();

}

两次的输出结果为:

子系统方法1

子系统方法2

子系统方法3

-----------------------

子系统方法1

子系统方法2

子系统方法3

三、开发中外观模式应用场景

其实外观模式就是我们常见的封装,在我们实际开发中,遇到的各种对子系统各模块封装的逻辑,都可以理解为外观模式

JDBC封装后的,commons提供的DBUtils类

Hibernate提供的工具类,Spring JDBC工具类等

Java23种设计模式学习笔记【目录总贴】

参考资料:

  大话设计模式(带目录完整版).pdf

  HEAD_FIRST设计模式(中文版).pdf

  尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】

时间: 2024-10-24 11:19:31

外观模式(Facade)的相关文章

设计模式 - 外观模式(facade pattern) 详解

外观模式(facade pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 外观模式(facade pattern): 提供了一个统一的接口, 用来访问子系统中的一群接口. 外观定义了一个高层接口, 让子系统更容易使用. 外观模式包含三个部分: 1. 子系统: 子类, 单个复杂子类 或 多个子类; 2. 外观(facade)类: 把子系统设计的更加容易使用; 3. 客户: 只需要调用外观类. 与适配器模式(adapter pattern)的

研磨设计模式解析及python代码实现——(二)外观模式(Facade)

一.外观模式定义 为子系统中的一组接口提供一个一致的界面,使得此子系统更加容易使用. 二.书中python代码实现 1 class AModuleApi: 2 def testA(self): 3 pass 4 class AModuleImpl(AModuleApi): 5 def testA(self): 6 print "Now Call testA in AModule!" 7 class BModuleApi: 8 def testB(self): 9 pass 10 cla

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

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

Web中的积累:外观模式 Facade

Web中的积累:外观模式 Facade 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 壹 前言 目测好久没写文章了,距离上一篇文章也有二十多天.我是怎么了?哈哈~,两个字:生命.生命似乎说大了,那健康吧.吃一堑长一智吧 思考对生活 对生命 我的信仰?佛教?基督?-当你生病了,有药吃.比如感冒了感冒药你会觉得药难吃.人吗就是那样,但当你想到了,你生病了没药可吃是多么无奈.比如我 胸闷 胸疼.随之而来的是蹦波劳累,上海

二十四种设计模式:外观模式(Facade Pattern)

外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 示例有一个Message实体类,某对象对它的操作有Get()方法,另外还有一个对象有一个Validate()方法来判断用户是否有权限.现在提供一个高层接口来封装这两个方法. MessageModel using System; using System.Collections.Generic; using System.Text; nam

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

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

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

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

11.外观模式(Facade Pattern)

using System; namespace ConsoleApplication4 { class Program { /// <summary> /// 不使用外观模式的情况 /// 此时客户端与三个子系统都发送了耦合,使得客户端程序依赖与子系统 /// 为了解决这样的问题,我们可以使用外观模式来为所有子系统设计一个统一的接口 /// 客户端只需要调用外观类中的方法就可以了,简化了客户端的操作 /// 从而让客户和子系统之间避免了紧耦合 /// </summary> ///

外观模式Facade(结构型)

外观模式是迪米特法则的代表 迪米特法则:系统中的类,尽量不要与其他类互相作用,减少类之间的耦合度,如果两个类之间不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用 通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. 优点: 1)屏蔽了底层实现细节,使客户代码将变得很简单,统一和facade对象关联 2)提供了一个访问子系统的统一入口,并

外观模式(facade)C#

外观工厂模式c#上简单例子 功能:玩家有各自的移动和跳跃功能,通过外观模式实现,将所有玩家移动组合在功能1,将所有玩家跳跃功能组合在功能2中 namespace facade { public partial class Form1 : Form { private void btnFacade_Click(object sender, EventArgs e) { facadeFactory ff = new facadeFactory();//外观模式隐藏了玩家,用户不知道有几个玩家 ff.