24天学会设计模式----门面模式(外观模式)

一、门面模式

1、定义

GOF《设计模式》一书对Facade模式是这样描述的:

为子系统中的一组接口提供一个统一接口。Facade模式定义了一个更高层的接口,使子系统更加容易使用。

2、结构

门面角色:客户端可以调用这个角色的方法。此角色知道子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统中去。

子系统角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每个子系统都可以被客户端直接调用,或者被门面角色调用。

3、适用性

(1) 不需要使用一个复杂系统的所有功能,而且可以创建一个新的类,包含访问系统的所有规则。如果只需要使用系统的部分功能,那么你为新类所创建的API将比原系统的API简单的多。

(2) 希望封装或者隐藏系统原系统。

(3) 希望使用原系统的功能,而且还希望增加一些新的功能。

(4) 编写新类的成本小于所有人学会使用或者未来维护原系统上所需的成本。

二、使用范例

下面以到商店买东西为例,一般情况下,我们要买东西都是直接到商店去买,而不是到生产产品的工厂去买,这里的商店就可以看成是一个门面,然后工厂就是一个一个的子系统,当你需要什么货品时,直接去商店买就是了,不用管工厂的事,商店来根据你要的产品,选择不同的工厂来进货。

package com.model.facade;
/**
 * 一个香皂类
 */
class Coat{
	public String toString(){
		return "香皂一个";
	}
}
/**
 * 生产香皂的厂家
 */
public class CoatFactory {
	/**
	 * 厂家卖香皂
	 */
	public Coat saleCoat(){
		return new Coat();
	}

}
package com.model.facade;
/**
 * 电脑类
 */
class Computer{
	public String toString(){
		return "电脑一台";
	}
}
/**
 * 生产电脑的厂家
 */
public class ComputerFactory {
	/**
	 * 卖电脑
	 */
	public Computer saleComputer() {
		return new Computer();
	}
}
package com.model.facade;
/**
 * 水果类
 */
class Fruit{
	public String toString(){
		return "水果一箱";
	}
}
/**
 * 生产水果的厂家
 */
public class FruitFactory {
	/**
	 * 卖水果
	 */
	public Fruit saleFruit(){
		return new Fruit();
	}

}

商店来了:

package com.model.facade;
/**
 * 商店,专门来买进工厂的东西,然后卖给客户
 */
public class Store {
/**
 * 商店卖香皂
 */
public Coat saleCoat(){
	CoatFactory m_CoatFactory=new CoatFactory();
	return m_CoatFactory.saleCoat();
}
/**
 * 商店卖电脑
 */
public Computer saleComputer(){
	ComputerFactory m_Computer=new ComputerFactory();
	return m_Computer.saleComputer();
}

/**
 * 商店卖水果
 */
public Fruit saleFruit(){
	FruitFactory m_FruitFactory=new FruitFactory();
	return m_FruitFactory.saleFruit();
}

}

顾客来了:

package com.model.facade;
/**
 * @author 林炳文
 * @time 2015.2.10
 * 门面模式讲解
 */
public class Main {

	public static void main(String[] args) {
		Store m_Store=new Store();
		//买衣服  
        System.out.println("顾客买到:"+m_Store.saleCoat());  
        //买电脑  
        System.out.println("顾客买到:"+m_Store.saleComputer());  
        //买水果
        System.out.println("顾客买到:"+m_Store.saleFruit());  

	}

}

结果:

顾客买到:香皂一个
顾客买到:电脑一台
顾客买到:水果一箱

三、优缺点

1、优点

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

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

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

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

2、缺点

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

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

总结

Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。Facade更注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。

时间: 2024-11-14 15:43:40

24天学会设计模式----门面模式(外观模式)的相关文章

C#设计模式之十外观模式(Facade Pattern)【结构型】

原文:C#设计模式之十外观模式(Facade Pattern)[结构型] 一.引言 快12点半了,要开始今天的写作了.很快,转眼设计模式已经写了十个了,今天我们要讲[结构型]设计模式的第五个模式,该模式是[外观模式],英文名称是:Facade Pattern.我们先从名字上来理解一下"外观模式".我看到了"外观"这个词语,就想到了"外表"这个词语,两者有着很相近的意思.就拿谈恋爱来说,"外表"很重要,如果第一眼看着很舒服.有眼

设计模式学习之外观模式(Facade,结构型模式)(8)

1.什么是外观模式为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 2.为什么要使用外观模式在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,从而导致客户程序随着子系统的变化而变化,那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦? 现在来考虑这样一个抵押系统,当有一个客户来时,有如下几件事情需要确认:到银行子系统查询他是否有足够多的存款,到信用子系统查询他是否有良好的信

门面模式/外观模式

原文链接:http://www.tutorialspoint.com/design_pattern/facade_pattern.htm Facade Pattern(门面模式/外观模式) 隐藏了系统的复杂性,为客户端访问系统提供了一个接口.Facade Pattern 属于结构型模式的一种,通过添加一个接口来隐藏现有系统的复杂性. Facade Pattern 涉及到一个类,这个类代理调用了现有系统的类的一些方法,从而为客户端提供了简化的方法来访问系统. 实现 我们将会创建一个 Shape 接

Java设计模式11:外观模式

外观模式 外观模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的外观对象进行.外观模式是一个高层次的接口,使得子系统更易于使用. 医院的例子 现代的软件系统都是比较复杂的.假如把医院比作一个子系统,按照部门职能,这个系统划分为挂号.门诊.划价.化验.收费.取药等.看病的人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事. 解决这种不便的方法便是引入外观模式,医院可以设置一个接待员的位置,由接待员负责代为挂号.划价.缴费.取药等.病人只需要接

设计模式-适配器模式和外观模式

1.适配器模式 适配器模式是针对接口不一时处理的情况,比如我的类的参数是IInterface1,但是我现在想要调用IInterface2接口的函数,怎么办呢?就是用适配器来解决这个问题: public interface IInterface1(){ public void method1(); } public interface IInterface2(){ public void method2(); } public class adapter implements IInterface

c#设计模式之:外观模式(Facade)

一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 "门面"模式.下面就具体介绍下外观模式. 二.外观模式的详细介绍 2.1定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部

java设计模式 GOF23 10 外观模式

一.外观模式简介 外观模式是为了解决类与类之间的依赖关系,这种模式将类与类之间的关系放到一个Facade类中,从而降低类与类之间的耦合. 二.简单代码实现 package com.lz.facade; /* * 外观模式 * 门面对象 */ public class RegisterFacade { public void register() { new 南京工商局().checkName(); new 南京税务局().taxCertificata(); } } package com.lz.

设计模式学习笔记--外观模式

好久没写设计模式的blog了,这次重新回来填坑,先找一个最简单但是却最常用的设计模式来学习,外观模式.其实说是一个设计模式,其实我们在实际的编程中无时无刻不在用外观模式,可以说这个设计模式已经渗透到编程的各个方便,可能我们自己没感觉出来罢了. 一.外观模式的定义 先来看一下外观模式的定义: 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个接口使得这一系列子系统更加容易使用. 简单解释一下,所谓外观模式,就是在我们设计系统的时候,将若干个子系统的功

读书笔记之设计模式-适配器和外观模式

结构型:Adapter与Facade(适配器和外观模式) 一般作为阅读材料,首先想要明确的是我现在了解的设计模式的初衷,即为了解决什么问题. 适配器,如果有买过港版Iphone在内地使用的人应该会有三角大插头必须接一个转换器才能在一般的插座上使用的情况,当然这只是比较直观的感受.其实我们平时用的手机充电器都是属于适配器,试想如果我们没有这个充电器,我们如何利用普通插座给手机充电? 适配器的定义:将手头上所持有的接口转换成我们需要的接口(业务场景:经常是为了适配旧程序或者对接2套系统的时候使用,当