设计模式之门面模式

Posted 独孤九戒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之门面模式相关的知识,希望对你有一定的参考价值。

设计模式之门面模式

    门面模式(Facade Pattern)也叫外观模式,是一种常见的封装模式,定义:Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.(要求一个子系统的外部与其内部的通信必须通过统一的对象进行。门面模式提供一个高层次的接口,使子系统更易于使用)

    门面模式注重“统一的对象”,也就是提供一个访问子系统的接口,除了这个接口不允许有任何访问子系统的行为发生。

通用类图


    Subsystem Classes是子系统所有类的简称,可能代表一个类,也可能代表几十个对象的集合。简单地说,门面对象是外界访问子系统内部的唯一通道,不管系统内部多么复杂,只要门面对象在,就可以做到“金玉其外败絮其中”。

两个角色

1.Facade门面角色,客户端可以调用这个角色的方法,此角色知晓子系统的所有功能和责任。一般情况下,本角色会将所有从客户端发来的请求委派到相应的子系统中,也就是说该角色没有实际的业务逻辑,只是一个委托类;

2.subsystem子系统角色,可以同时拥有一个或多个子系统,每一个子系统不是一个单独的类,而是一个类的集合,子系统并不知道门面的存在。对呀子系统而言,门面仅仅是另外一个客户端而已。

通用源码

子系统

public class ClassA 
	public void doSomethingA()
		
	
public class ClassB 
	public void doSomethingB()
		
	

public class ClassC 
	public void doSomethingC()
		
	

门面对象

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.减少系统的相互依赖,所有的依赖都是对门面的依赖,与子系统无关;

2.提高了灵活性,依赖减少了,灵活性自然提高,不管子系统内部如何变化,只要不影响到门面对象,可随意活动;

3.提高安全性,不在门面上开通的方法,客户端不能访问。

门面模式缺点

不符合开闭原则,对修改关闭,对扩展开放。

门面模式使用场景

1.为一个复杂的模块或子系统提供一个供外界访问的接口;

2.子系统相对独立,外界对子系统的访问只要黑箱操作即可;

3,。预防低水平人员带来的风险扩散。

例子:信件投递全过程

写信过程接口

public interface ILetterProcess 
	public void writeContext(String context);
	public void fillEnvelope(String address);
	public void letterInotoEnvelope();
	public void sendLetter();

写信过程实现

public class LetterProcessImpl implements ILetterProcess
	public void writeContext(String context)
		System.out.println("信的内容:"+context);
	
	public void fillEnvelope(String address)
		System.out.println("信的地址:"+address);
	
	public void letterInotoEnvelope()
		System.out.println("装入信封");
	
	public void sendLetter()
		System.out.println("投递");
	

现代邮局

public class MordenPostOffice 
	private ILetterProcess letterProcess=new LetterProcessImpl();
	public void sendLetter(String context,String address)
		letterProcess.writeContext(context);
		letterProcess.fillEnvelope(address);
		letterProcess.letterInotoEnvelope();
		letterProcess.sendLetter();
	

场景类

public class Client 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
		MordenPostOffice postOffice=new MordenPostOffice();
		String adress="nanannananna";
		String context="happy birthday";
		postOffice.sendLetter(context, adress);
	


邮件检查类

public class Police 
	public void checkLetter(ILetterProcess letterProcess)
		System.out.println("检查信件");
	

场景类

public class MordenPostOffice 
	private ILetterProcess letterProcess=new LetterProcessImpl();
	private Police letterPolice=new Police();
	public void sendLetter(String context,String address)
		letterProcess.writeContext(context);
		letterProcess.fillEnvelope(address);
		letterPolice.checkLetter(letterProcess);
		letterProcess.letterInotoEnvelope();
		letterProcess.sendLetter();
	





以上是关于设计模式之门面模式的主要内容,如果未能解决你的问题,请参考以下文章

java设计模式之门面模式

java设计模式之门面模式

java设计模式之门面模式

架构师内功心法,外界访问系统内部唯一通道的门面模式详解

架构师内功心法,外界访问系统内部唯一通道的门面模式详解

设计模式--门面模式C++实现