设计模式 --外观模式(Facade)

原文链接:https://my.oschina.net/u/1781072/blog/542641

什么是外观模式?

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。  

简单点说:外观模式是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。

概述:

在真实的应用系统中,一个子系统可能由很多类组成。子系统的客户为了它们的需要,需要和子系统中的一些类进行交互。客户和子系统的类进行直接的交互会导致客户端对象和子系统之间高度耦合。任何的类似于对子系统中类的接口的修改,会对依赖于它的所有的客户类造成影响。

设计模式 --外观模式(Facade)

从上面外观模式的定义我们看以看到外观模式能很好的解决上述问题,为子系统提供了一个更高层次、更简单的接口,从而降低了子系统的复杂度和依赖。这使得子系统更易于使用和管理。

外观是一个能为子系统和客户提供简单接口的类。当正确的应用外观,客户不再直接和子系统中的类交互,而是与外观交互。外观承担与子系统中类交互的责任。实际上,外观是子系统与客户的接口,这样外观模式降低了子系统和客户的耦合度。

设计模式 --外观模式(Facade)

实例:

下面用一个简单的例子来说明外观模式:

结构图:

设计模式 --外观模式(Facade)

子系统类通常是一些业务类,实现了一些具体的、独立的业务功能,其典型代码如下:

class One{
		    public void MethodA(){
		        System.out.println( "methodA--> is runing" );
		    }
		}
		
		class Two{
		    public void MethodB(){
		        System.out.println( "methodB--> is runing" );
		     }
		}
		
		class Three{
		    public void MethodC(){
		        System.out.println( "methodC--> is runing" );
		    }
		}
		
		class Four{
		    public void MethodD(){
		       System.out.println( "methodD--> is runing" );
		    }
		}

在引入外观类之后,与子系统业务类之间的交互统一由外观类来完成,在外观类中通常存在如下代码:

class Facade{
		    private One obj1 = new One();
		    private Two obj2 = new Two();
		    private Three obj3 = new Three();
		    private Four obj4 = new Four();
		
		    public void Method1(){
			System.out.println("方法组1");
		        obj1.MethodA();
		        obj2.MethodB();
		        obj3.MethodC();
		    }
			public void Method2(){
			System.out.println("方法组2");
		        obj1.MethodA();
		        obj2.MethodB();
			obj4.MethodD();
		    }
		}

由于在外观类中维持了对子系统对象的引用,客户端可以通过外观类来间接调用子系统对象的业务方法,而无须与子系统对象直接交互。引入外观类后,客户端代码变得非常简单,典型代码如下:

class Program{
		    static void Main(string[] args){
		        Facade facade = new Facade();
		        facade.Method1();
			facade.Method2();
		    }
}

何时使用外观模式?  

第一:设计初期阶段,有意识的将不同的两个层分离,层与层之间建立外观Facade,这样就可以为复杂的子系统提供一个简单的接口,耦合性降低。  

第二:在开发阶段,子系统往往因为不断的重构演化而变的越来越复杂,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖性.  

第三:维护一个大型系统时,可能这个系统已经非常难以维护和扩展,此时可以为系统新开发一个Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。



转载于:https://my.oschina.net/u/1781072/blog/542641

上一篇:php – Laravel:外观实际上是在调用方法上创建新对象吗?


下一篇:maven打包发布及搭建私服