`
指尖残血
  • 浏览: 2996 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

本文参考:《修炼Java开发技术:在架构中体验设计模式和算法之美   于广编著》。

 

外观模式也被称为Facade模式,能够为子系统的一组接口提供一个统一接口。facade模式定义了一个更高层的接口,使子系统更加容易使用。外观模式是一种接口型模式,它主要解决的问题是:组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。

 

外观模式的核心思想:

       在真实的应用系统中,一个子系统可能由很多类组成。子系统的客户为了满足他们的需要,需要与子系统的一些类进行交互,客户和子系统的类进行直接的交互会导致客户端对象与子系统之间高度的耦合。

       外观模式为了子系统提供了一个更高的层次、更简单的接口,从而降低了子系统的复杂度和依赖,这使得子系统更易于使用和管理。外观是一个能为子系统和客户提供简单接口的类。当正确的应用外观时,客户不在直接与子系统的类交互,而是与外观交互。外观承担与子系统中类交互的责任。实际上,外观是子系统与客户的接口,这样外观模式降低了子系统和客户的耦合。

       外观模式是由代理模式发展而来的,与代理模式类似,代理模式是一对一的代理,而外观模式是一对多的代理,与装饰模式的不同,装饰模式是增加对象的功能,而外观模式则是提供一个简化的调用方式。

 

外观模式的结构:

clientA       clientB      clientC

   |                   |                |

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

                       |

                   Facade

                       |

                       |                                      Subsystem Classes

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

        |                       |                        |                     |                      ..................

subsystem1    subsystem2         subsystem3    subsystem4        

 

门面角色(Facade):这是外观模式的核心。它被客户角色低啊用,因此它熟悉子系统的功能。

子系统角色(subsystem1,subsystem2):实现了子系统的功能。对子系统角色来说,Facade角色与客户   角色一样,是未知的。

客户角色:调用Facade角色来完成要得到的功能。

 

简单的说明性的例子:

子系统

package org.dyb.design.facade;
/*
 * A子系统
 */
public class SystemA {
	/*
	 * A子系统实现功能
	 */
	public void doSomething() {
		System.out.println("实现A子系统功能");
	}
}

 

package org.dyb.design.facade;
/*
 * B子系统
 */
public class SystemB {

	/*
	 * B子系统实现功能
	 */
	public void doSomething() {
		System.out.println("实现B子系统功能");
	}
}

 

package org.dyb.design.facade;
/*
 * C子系统
 */
public class SystemC {

	/*
	 * C子系统实现功能
	 */
	public void doSomething() {
		System.out.println("实现C子系统功能");
	}
}

 外观类

package org.dyb.design.facade;
public class Facade {
	private SystemA systemA;
	private SystemB systemB;
	private SystemC systemC;
	
	public Facade() {
		systemA = new SystemA();
		systemB = new SystemB();
		systemC = new SystemC();
	}
	
	public void doABC() {
		this.systemA.doSomething();
		this.systemB.doSomething();
		this.systemC.doSomething();
	}
	
	public void doAB() {
		this.systemA.doSomething();
		this.systemB.doSomething();
	}
}

 客户端调用:

package org.dyb.design.facade;

public class MainClass {
	public static void main(String[] args) {
		Facade facade = new Facade();
		facade.doABC();
	}
}

外观模式的应用场合:

1、为一个复杂系统提供一个简单接口。

2、提高子系统的独立性。

3、在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

 

外观模式的优点:

1、对客户屏蔽子系统组件,因而减少了客户处理的对象数目,从而使得子系统使用起来更加方便。

2、实现了子系统与客户之间的松散耦合关系,而子系统内部的功能组件往往是紧耦合的。

3、如果需要,也不限制使用子系统类。

分享到:
评论

相关推荐

    外观模式1

    外观模式(Facade Pattern)是一种设计模式,旨在简化复杂的系统接口,提供一个统一的入口点,以便客户端能够更容易地与子系统交互,而无需了解子系统的内部实现细节。这种模式遵循了“开闭原则”和“迪米特法则”,...

    外观模式Demo

    外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用来访问子系统中的一组接口。外观模式使子系统更容易被使用,因为它为复杂的子系统提供了一个简单的接口,客户端通过这个接口与子系统...

    8外观模式1

    在描述中提到的三个UML应用场景都体现了外观模式的核心价值。 1. **为一个复杂的子系统提供一个简单的接口**:当一个子系统包含众多类和接口,其内部结构复杂时,客户端可能难以理解和使用。外观模式通过创建一个高...

    java设计模式之外观模式学习笔记

    外观模式(Facade Pattern)是一种设计模式,主要用于简化子系统或组件的使用,提供一个统一的接口,使得客户端不必关心复杂的内部实现,降低了系统的耦合度。在Java设计模式中,外观模式扮演着重要角色,它使得系统...

    Java设计模式-外观模式

    外观模式(Facade Pattern)是设计模式中的一种结构型模式,其主要目的是为了提供一个统一的接口,以便于客户端更容易地使用复杂的子系统。通过引入一个外观类,客户端可以通过调用这个外观类的方法来访问子系统,而...

    23种设计模式(8) java外观模式

    Java外观模式详解 Java外观模式是23种设计模式之一,主要为大家介绍了外观模式的定义、角色、示意图、示例代码、优点、适用场景和总结。 定义 外观模式定义了一个高层接口,使得子系统更加容易使用。它为子系统中...

    第14章_外观模式.ppt

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

    外观模式的示例

    考虑这样一个抵押系统,当有一个客户来时,有如下几件事情需要确认:到银行子系统查询他是否有足够多的存款,到信用子系统查询他是否有良好的信用,到贷款子系统查询他有无贷款... 未采用外观模式的类结构图见附件。

    外观模式_zipperghp_外观模式_

    外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用来访问子系统中的一组接口。外观模式使子系统更容易被使用,因为它为子系统的复杂接口提供了一个简单的替代品。在这个主题中,我们将...

    iOS 设计模式 外观模式

    外观模式的核心思想是为复杂的子系统提供一个简单的接口,这个接口只暴露必要的方法,隐藏了子系统的复杂性。在iOS开发中,我们经常遇到多个类或者模块之间的交互,这时候如果直接让客户端与所有子系统交互,会导致...

    Android外观模式demo

    下面我们将详细探讨Android外观模式的概念、结构以及如何通过提供的"Android外观模式demo"进行实践。 外观模式的核心思想是提供一个统一的入口,隐藏系统的复杂性。在Android环境中,这通常意味着创建一个类,该类...

    通过C++实现外观模式(Facade Pattern).rar

    在C++中,外观模式(Facade Pattern)同样用于为子系统中的一组接口提供一个统一的接口,使得子系统更容易使用。压缩包文件代码是一个简单的C++实现外观模式的示例。 1、定义各个子系统的类及其接口。 2、定义外观类...

    设计模式之外观模式和代理模式

    其中,外观模式(Facade)和代理模式(Proxy)是行为型设计模式中的两种,它们在处理类和对象的复杂交互时扮演着重要的角色。 外观模式的中心思想是为一个复杂的子系统提供一个简单、统一的高层接口,使得客户端...

    PHP设计模式(九)外观模式Facade实例详解【结构型】

    【外观模式(Facade)详解】 外观模式是一种结构型设计模式,其主要目的是为了解决复杂的系统划分成多个子系统后,如何降低子系统间的耦合度,提高系统的可维护性和可扩展性。它通过提供一个统一的接口,使得外部...

    通过python实现外观模式(Facade Pattern).rar

    外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供一个统一的接口,使得子系统更容易使用。外观模式定义了一个高层接口,使得这一子系统更加容易使用。 压缩包文件代码是一个简单的 ...

Global site tag (gtag.js) - Google Analytics