设计模式 -- Facade

Facade模式

  Facade模式要求一个子系统的外部与其内部的通信必须通过一个统一的Facade对象进行。Facade模式提供一个高层次的接口,使得子系统更易于使用。  

 

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

 

观察者模式的结构

 

  

 

 

 Facade的几个要点

  从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Façade接口的变化。  

 

   Façade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Façade很多时候更是一种架构设计模式。 

 

   Façade设计模式并非一个集装箱,可以任意地放进任何多个对象。Façade模式中组件的内部应该是“相互耦合关系比较大的一系列组件”,而不是一个简单的功能集合。  

 

   注意区分Façade模式、Adapter模式、Bridge模式与Decorator模式。Façade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。

 

 

适用性

 

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

 

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

 

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

 

 

 

Facade模式的模型

  A系统有A1, A2, A3等类。客户端需要调用A系统的的A1.doSomething1();A2.doSomething2();A3.doSomething3()来完成某功能。
Facade模式的实现模型就是:

 

A系统:

 

class A1 {
    public void doSomething1();
}

 

class A2 {
    public void doSomething2();
}

 

class A3 {
    public void doSomething3();
}

 

Facade:
public class Facade {
    public void doSomething() {
        A1 a1 = new A1();
        A1 a2 = new A2();
        A1 a3 = new A3();

 

        a1.doSomething1();
        a2.doSomething2();
        a3.doSomething3();
    }
}

 


Test:
public class Client {
    public static void main(String []args) {
        Facade facade = new Facade();
        facade.doSomething();
    }
}


结构

二者对比可以看出差别么?
举例来看:一个坦克系统,子系统是履带系统,发动机系统,火炮系统,防卫装甲系统等。对外的接口就是暴露给使用人员的是Run(), shot(), stop()等。
如果没有采用Facade模式,开动坦克需要直接依赖履带系统,发动机系统。直接去操作履带,操作发动机? 
各个接口和子系统都产生了紧耦合。

问题产生了:组件的客户(接口)和组件内各个复杂子系统有过多的耦合,随着外部客户程序和各个子系统的变化,这种耦合面临着变化的挑战。
如何简化外部客户程序和系统间的交互接口,如何将外部程序的演化和内部子系统的变化解耦?
使该简单的简单!不管内部实现怎么变化,我们只要Run(), shot(), stop()!

意图

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。[GOF 《设计模式》]

生活中的例子(TerryLee)

外观模式为子系统中的接口定义了一个统一的更高层次的界面,以便于使用。当消费者电话订购时,则体现了一个外观模式。消费者拨打一个号码与客服代表联系,客服代表则扮演了这个"外观",他包含了与订货部、收银部和送货部的接口。 

代码示例(dofactory)

贷款抵押应用程序组件(a large subsystem of classes measuring the creditworthyness of an applicant)
如何provides a simplified interface给这个组件?


//外观类
public class Mortgage
{
    
private Bank bank = new Bank();
    
private Loan loan = new Loan();
    
private Credit credit = new Credit();

    
public bool IsEligible(Customer cust, int amount)
    {
        Console.WriteLine(
"{0} applies for {1:C} loan\n",
          cust.Name, amount);

        
bool eligible = true;

        
if (!bank.HasSufficientSavings(cust, amount))
        {
            eligible 
= false;
        }
        
else if (!loan.HasNoBadLoans(cust))
        {
            eligible 
= false;
        }
        
else if (!credit.HasGoodCredit(cust))
        {
            eligible 
= false;
        }

        
return eligible;
    }
}

//银行子系统
public class Bank
{
    
public bool HasSufficientSavings(Customer c, int amount)
    {
        Console.WriteLine(
"Check bank for " + c.Name);
        
return true;
    }
}

//信用证子系统
public class Credit
{
    
public bool HasGoodCredit(Customer c)
    {
        Console.WriteLine(
"Check credit for " + c.Name);
        
return true;
    }
}

//贷款子系统
public class Loan
{
    
public bool HasNoBadLoans(Customer c)
    {
        Console.WriteLine(
"Check loans for " + c.Name);
        
return true;
    }
}

//顾客类
public class Customer
{
    
private string name;

    
public Customer(string name)
    {
        
this.name = name;
    }

    
public string Name
    {
        
get { return name; }
    }
}

//客户程序类
public class MainApp
{
    
public static void Main()
    {
        
//外观
        Mortgage mortgage = new Mortgage();

        Customer customer 
= new Customer("Ann McKinsey");
        
bool eligable = mortgage.IsEligible(customer, 125000);

        Console.WriteLine(
"\n" + customer.Name +
            
" has been " + (eligable ? "Approved" : "Rejected")); 
        Console.ReadLine();
    }
}

类图:


题外话---
次级债、金融危机就是这样产生的,唉。
设计模式一方面简化了我们的工作,一方面把内部的细节隐藏起来。
这个门面类一定是投机者写出来的;银行员工拿来mortgage.IsEligible(...)   无语...
关于这个例子,TerryLee在这里给了更详尽的演化过程。

适用性

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

总结

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值