文档章节

Facade 模式

凯文加内特
 凯文加内特
发布于 2015/04/23 08:36
字数 872
阅读 90
收藏 0

结构

二者对比可以看出差别么?
举例来看:一个坦克系统,子系统是履带系统,发动机系统,火炮系统,防卫装甲系统等。对外的接口就是暴露给使用人员的是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模式注重稳定接口的前提下为对象扩展功能。


本文转载自:http://www.cnblogs.com/DylanWind/archive/2008/11/19/1336151.html

凯文加内特
粉丝 341
博文 701
码字总数 110786
作品 0
青岛
后端工程师
私信 提问
Facade模式[fəˈsɑːd]

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

凯文加内特
2015/04/23
104
0
结构型模式:Facade 外观模式

结构型模式:Facade 外观模式 1、系统的复杂度 1)假设我们需要开发一个坦克模拟系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎、控制器、车轮、车身等各子系统构成。 //...

flyhighly
2011/04/24
62
0
【白话设计模式二】外观模式(Facade)

白话设计模式 工厂模式 单例模式 【白话设计模式一】简单工厂模式(Simple Factory) 【白话设计模式二】外观模式(Facade) 【白话设计模式三】适配器模式(Adapter) 【白话设计模式四】单例模式...

陶邦仁
2016/02/15
1K
1
设计模式——Facade(外观)

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 适用性: 当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演...

abdureshid
2015/12/07
4
0
设计模式之Facade,Adapter, Proxy

Facade,Adapter,Proxy模式有点类似,功能上都是对调用者提供调用接口,但他们的目的就有些不同。最近正在做一个域名系统,其中就用到了Facade和Adapter模式。正好结合项目来分析下这几种设...

caoxinyu0205
2016/09/03
67
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue warn]: Computed property "activeNames" was assigned to but it has no setter.

在使用 vue,element-ui时,如下代码 <template> <el-form :model="numberValidateForm" ref="numberValidateForm"> <el-form-item> <el-tabs v-model="activeNames" @tab-cl......

牧云橙
29分钟前
5
0
重构-改善既有代码的设计-6.2内联函数

6.2内联函数 动机 本书经常以简短的函数表现动作意图,这样会使代码更清晰易读。但有时候你会遇到某些函数,其内部代码和函数名称同样清晰易读。也可能你充够了该函数的内部实现,使其内容和...

还仙
30分钟前
6
0
Less 混入

混合类似于编程语言中的函数。 Mixins 是一组CSS属性,允许我们将一个类的属性嵌套于另一个类,被嵌入的类可以看作是变量,并且包含类名作为其属性,也就是说我们可以用一个类定义样式然后把...

凌兮洛
33分钟前
6
0
频繁FGC的真凶原来是它

频繁FGC的真凶原来是它 上周排查了一个线上问题,主要现象是CPU占用过高,jvm old区占用过高,同时频繁fgc,我简单排查了下就草草收场了,但是过后我对这个问题又进行了复查,发现问题没有那...

每天晒白牙
33分钟前
6
0
简单的树形菜单如何写

业务需求 数据结构中含有图片、名称、children的树形结构,需要展示出每一级的图片名称和图片,找了些树形图的插件,都没有展示大的图片的,一般都是小图标,就自己试着写一个包含图的简单的...

tianyawhl
35分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部