类关系图


类角色说明
门面(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
子系统(subsystem)角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。

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

适用性
1、为一个复杂子系统提供一个简单接口  
2、 提高子系统的独立性  
3、 在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

泡妞的例子
FACADE—我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样 MM也可以用这个相机给我拍张照片了。

泡妞的代码

using System;
using System.Collections;

//子系统1
public class Aperture
{
    
public void Adjust()
    
{
        Console.WriteLine(
"光圈调好了!");
    }

}


//子系统2
public class Foci
{
    
public void Adjust()
    
{
        Console.WriteLine(
"焦距调好了!");
    }

}

public class MainApp 
  

    
public static void Main() 
    

    
//对于客户端来说,只要访问Facade提供的方法A,B就可以完成一定的操作
    
//Facade的作为作用就是将子系统的一组接口集成在一起,以提供一个一致的界面
      AutoCamera camera = new AutoCamera(); 
 
      camera.Active(); 
      Console.Read(); 
    }
 
  }
 
 
 
  
// 外观类 
  public class AutoCamera
  

    Aperture aperture; 
    Foci foci; 
 
    
public AutoCamera() 
    

      aperture 
= new Aperture(); 
      foci 
= new Foci(); 
    }
 
 
//将几个子系统的若干方法集成在一起,为外界提供统一的接口
    public void Active() 
    

        Console.WriteLine(
"自动对焦:");  
        foci.Adjust();
        Console.WriteLine(
"自动调整光圈:");
        aperture.Adjust();
        Console.WriteLine(
"可以按下快门了!");
    }
 
  }
 


门面模式
门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。

注意
就如同医院的接待员一样,门面模式的门面类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与门面对象打交道,而不需要与子系统内部的很多对象打交道。

优缺点
当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade 层。
客户程序与抽象类的实现部分之间存在着很大的依赖性。引入 Facade 将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。 
当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过 Facade 进行通讯,从而简化了它们之间的依赖关系。

posted on 2007-02-20 16:59  十分之七  阅读(277)  评论(0)    收藏  举报