详解JAVA面向对象的设计模式 (四)、外观模式

外观模式 Facade

外观模式内容相对简单,就不写新的例子了。本篇文章摘录自 http://c.biancheng.net/view/1369.html

外观模式的定义与特点

外观(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

外观(Facade)模式是“迪米特法则”的典型应用,它有以下主要优点。

  1. 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。

  2. 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。

  3. 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。

外观(Facade)模式的主要缺点如下。

  1. 不能很好地限制客户使用子系统类。

  2. 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

外观模式的结构与实现

外观(Facade)模式的结构比较简单,主要是定义了一个高层接口。它包含了对各个子系统的引用,客户端可以通过它访问各个子系统的功能。现在来分析其基本结构和实现方法。

1. 模式的结构

外观(Facade)模式包含以下主要角色。

  1. 外观(Facade)角色:为多个子系统对外提供一个共同的接口。

  2. 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。

  3. 客户(Client)角色:通过一个外观角色访问各个子系统的功能。

2. 模式的实现

外观模式的实现代码如下:

//外观角色
class Facade{
    private SubSystem01 obj1=new SubSystem01();
    private SubSystem02 obj2=new SubSystem02();
    private SubSystem03 obj3=new SubSystem03();
    public void method()    {
        obj1.method1();
        obj2.method2();
        obj3.method3();
    }
}
//子系统角色
class SubSystem01{
    public  void method1()
    {
        System.out.println("子系统01的method1()被调用!");
    }
}
//子系统角色
class SubSystem02{
    public  void method2()
    {
        System.out.println("子系统02的method2()被调用!");
    }
}
//子系统角色
class SubSystem03{
    public  void method3()    {
        System.out.println("子系统03的method3()被调用!");
    }
}

程序运行结果如下:

public class FacadePattern{
    public static void main(String[] args)    {
        Facade f=new Facade();
        f.method();
    }
}
/**
子系统01的method1()被调用!
子系统02的method2()被调用!
子系统03的method3()被调用!
**/

外观模式的应用场景

通常在以下情况下可以考虑使用外观模式。

  1. 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。

  2. 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。

  3. 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。

外观模式的扩展

在外观模式中,当增加或移除子系统时需要修改外观类,这违背了“开闭原则”。如果引入抽象外观类,则在一定程度上解决了该问题,其结构图如图 5 所示。

(0)

相关推荐

  • Facade外观模式

    >>返回<C#常用设计模式> 1. 简介 2. 示例 1. 简介 概述 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 比 ...

  • 设计模式之☞外观模式

    简介 外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易 ...

  • 深入浅出《设计模式》之外观模式(C++)

    前言 模式介绍 外观模式相比较之下比较简单,模式设计中定义是为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口是的这一子系统更加容易使用. 如果不理解呢,简单些说就是外观模式提 ...

  • 无废话设计模式(10)结构型模式--外观模式

    0-前言 外观模式定义:为子系统中的一组接口提供一个一致的界面,此模式定了一个高层接口    这一接口使得这一子系统更加容易使用: 1-实现 1-1.简单UML图: 1-2.代码实现 //1.子系统A ...

  • PHP设计模式—外观模式

    定义: 外观模式(Facade):又叫门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 代码实例: 假设实现一个功能需要用到子系统中的四 ...

  • 详解JAVA面向对象的设计模式 (七)、装饰模式

    装饰模式 Decorator 装饰模式比较简单,我就不单独写实现例子了.参考设计图去实现不是什么问题.建议可以写一写找找感觉. 在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修.相 ...

  • 详解JAVA面向对象的设计模式 (二)、策略模式

    策略模式 Strategy 介绍 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和 ...

  • 详解JAVA面向对象的设计模式 (一)、单例模式

    本系列,记录了我深刻学习设计模式的过程.也算是JAVA进阶学习的一个重要知识点吧. 与设计相关的代码会贴出,但是基础功能的代码会快速带过.有任何错误的地方,都欢迎读者评论指正,感谢.冲冲冲! 单例模式 ...

  • 从零开始学Java(十四)详解Java中的static关键字(上)

    ✔上一篇Java零基础系列文章我们说到了Java种this关键字的使用,今天继续来说说Java中的static关键字,篇幅较多,分为上下两篇更新,这篇文章主要内容: Java中static关键字 Ja ...

  • 从零开始学Java(十四)详解Java中的static关键字(下)

    接上篇Java-static关键字(上),今儿继续写完,这篇文章主要内容如下: Java static静态代码块 Java static静态方法 Java static静态代码块 静态代码块的语法格式 ...

  • 3W 字详解 Java 集合

    开源前哨 93篇原创内容 公众号 数据结构作为每一个开发者不可回避的问题,而 Java 对于不同的数据结构提供了非常成熟的实现,这一个又一个实现既是面试中的难点,也是工作中必不可少的工具,在此,笔者经 ...

  • 不是谁都能拍!详解《双子杀手》四个拍摄难点,120帧并不好玩

    李安导演的<双子杀手>上映3天,票房不算理想,上映次日就被<沉睡魔咒2>和动画片<航海王:狂热行动>反超,预计最终票房大概在2.5亿左右. 这样的结果并不意外,电影 ...

  • 24山向吉凶详解,罗盘二十四山兼向分金吉凶断语口诀

    24山向吉凶详解,罗盘二十四山兼向分金吉凶断语口诀

  • 详解王羲之书法十四种笔法

    王羲之在其<观形章>讲了十四种笔法,这里做一下分析. 夫临文用笔之法,复有数势,并悉不同.或有❶藏锋者大,藏锋在于腹内而起.❷侧笔者乏,亦不宜抽细而且紧.❸押笔者入,从腹起而押之,又云利道 ...