关闭

图文详解Java外观模式

241人阅读 评论(0) 收藏 举报

最近笔者一直在研究Java,这篇Java教程很详细的给大家梳理了一下Java外观模式的相关知识点,希望对大家有所帮助。

一、模式定义

外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。

 

二、模式结构

1. 角色组成

外观模式包含如下角色:

Facade: 外观角色

SubSystem: 子系统角色

 

2. 结构图

三、示例代码

首先,是各个子系统角色类,分别如下:

/**

 * 子系统类A

 * Created by blinkfox on 16/8/25.

 */public class ClassA {

 

    public void doSomethingA() {

        System.out.println("----业务方法A...");

    }

}

/**

 * 子系统类B

 * Created by blinkfox on 16/8/25.

 */public class ClassB {

 

    public void doSomethingB() {

        System.out.println("----业务方法B...");

    }

}

/**

 * 子系统类C

 * Created by blinkfox on 16/8/25.

 */public class ClassC {

 

    public void doSomethingC() {

        System.out.println("----业务方法C...");

    }

}

以下是外观模式的外观类:

/**

 * 外观门面类

 * Created by blinkfox on 16/8/25.

 */public class Facade {

 

    private ClassA a = new ClassA();

    private ClassB b = new ClassB();

    private ClassC c = new ClassC();

 

    // 提供给外部访问的方法

    public void methodA() {

        this.a.doSomethingA();

    }

 

    public void methodB() {

        this.b.doSomethingB();

    }

 

    public void methodC() {

        this.c.doSomethingC();

    }

}

四、模式分析

根据单一职责原则,在软件中将一个系统划分为若干个子系统有利于降低整个系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统的访问提供了一个简单而单一的入口。 -外观模式也是迪米特法则的体现,通过引入一个新的外观类可以降低原有系统的复杂度,同时降低客户类与子系统类的耦合度。

外观模式要求一个子系统的外部与其内部的通信通过一个统一的外观对象进行,外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。

外观模式的目的在于降低系统的复杂程度。

外观模式从很大程度上提高了客户端使用的便捷性,使得客户端无须关心子系统的工作细节,通过外观角色即可调用相关功能。

 

1. 优点

外观模式的优点k

对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。

实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。

降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。

只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。

2. 缺点

外观模式的缺点:

不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。

在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了开闭原则

3. 适用环境

在以下情况下可以使用外观模式:

当要为一个复杂子系统提供一个简单接口时可以使用外观模式。该接口可以满足大多数用户的需求,而且用户也可以越过外观类直接访问子系统。

客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。

在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。

 

五、模式总结

在外观模式中,外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。

外观模式包含两个角色:外观角色是在客户端直接调用的角色,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理;在软件系统中可以同时有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能。

外观模式要求一个子系统的外部与其内部的通信通过一个统一的外观对象进行,外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。

外观模式主要优点在于对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易,它实现了子系统与客户之间的松耦合关系,并降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程;其缺点在于不能很好地限制客户使用子系统类,而且在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了开闭原则

外观模式适用情况包括:要为一个复杂子系统提供一个简单接口;客户程序与多个子系统之间存在很大的依赖性;在层次化结构中,需要定义系统中每一层的入口,使得层与层之间不直接产生联系。

 

 

文章来自:闪烁之狐

0
0
查看评论

Java 设计模式——外观模式

今天要说的外观模式是一个相对简单的设计模式,而且在日常的开发中,可能你也会时常使用它,只是你可能并未想过这是一个设计模式。本文会从一些实例着手,来对本文要说明的外观模式进行尽可能全面的讲解。希望于你有益。
  • u013761665
  • u013761665
  • 2016-06-06 00:11
  • 3497

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是在现阶段各种第三方 SDK 基本很大概率都会使用外观模式。通过一个外观类使得整个系统的接口只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节。当然,在我们...
  • zhao_zepeng
  • zhao_zepeng
  • 2016-07-17 18:14
  • 3488

外观模式(注意区别于中介者模式)

一.外观模式(有点像中介者模式) 通过一个外观类使得整个系统的接口只有一个统一的高层接口,这样就能降低用户的使用成本,也就对用户屏蔽了很多实现细节,当然在我们的开发过程中,外观模式也是我们封装API的常用手段   二.外观模式定义 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进...
  • u011889786
  • u011889786
  • 2016-06-05 21:24
  • 1659

数据库连接池之外观模式+单例模式的实现

项目实践之技术突破之一Java应用程序访问数据库的基本原理  在Java语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁,  即Java语言通过JDBC技术访问数据库。JDBC是一种“开放”的方案,它为数据库应用开发人员﹑数据库前台工具开发人员提供了一...
  • grland
  • grland
  • 2008-01-02 01:22
  • 1610

Java设计模式之——外观模式

外观模式的简单介绍外观模式在开发过程中的运用频率非常高,尤其是在现阶段各种第三方 SDK 充斥在我们的周边,而这些 SDK 很大概率会使用外观模式。通过一个外观类使得整个系统的接口只有一个统一的高层接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节。当然,在我们的开发过程中,外观模式也是我...
  • AkaiC
  • AkaiC
  • 2016-11-02 20:47
  • 266

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

医院的例子   现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统。如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各...
  • jason0539
  • jason0539
  • 2014-04-02 07:16
  • 25974

【设计模式之三:模式对比】外观模式、代理模式与中介者模式的区别

外观模式 个人理解:         子类继承外观类的所有属性方法,客户端只需要跟外观类进行交流,实现了对所有子类的封装。 没有使用外观类 如图:         应用外观类 如图:  ...
  • cangchen
  • cangchen
  • 2015-04-08 23:05
  • 2773

深入浅出设计模式之命令模式、适配器模式、外观模式

命令模式
  • u011531613
  • u011531613
  • 2017-03-22 20:42
  • 482

java最常用的设计模式之一外观模式

外观模式定义:提供了一个统一的接口,用来访问子系统中的很多接口。外观定义了一个高层接口,让子系统更容易被客户端使用。 外观模式基本上可以说是Java设计模式中最简单的一种设计模式了,该模式通俗简单来说就是当我们在客户端需要调用一个子系统(其实就是一个比较大的功能模块啦,或一个外部的SDK),客户端...
  • jamesshaoya
  • jamesshaoya
  • 2016-02-01 17:24
  • 399

《Java设计模式》之外观模式

外观模式(Facade pattern)涉及到子系统的一些类。所谓子系统,是为提供一系列相关的特征(功能)而紧密关联的一组类。例如,一个Account类、Address类和CreditCard类相互关联,成为子系统的一部分,提供在线客户的特征。   在真实的应用系统中,一个子系统可能由很多类组成。...
  • u011225629
  • u011225629
  • 2015-08-16 08:00
  • 1524
    个人资料
    • 访问:243215次
    • 积分:11715
    • 等级:
    • 排名:第1544名
    • 原创:942篇
    • 转载:2篇
    • 译文:0篇
    • 评论:18条
    最新评论