设计模式之八:外观模式(Facade)

外观模式:

为子系统中的一系列接口提供了一个统一的界面。外观模式定义了一个高层次的接口以使子系统更加容易使用。

Provide a unified interface to a set of interfaces in a subsystem.
Fa?ade defines a higher-level interface that makes the subsystem easier to use.

UML图:

主要包括:

  1. Facade(MortgageApplication):了解每个子系统负者的功能;将客户端的请求分发给合适的子系统。
  2. SubSystem classes(Bank,Credit,Loan):实现子系统的功能,处理Facade指定的业务,这个类中没有Facede类的信息。

C++代码实现:

#include <iostream>

class SubSystem1
{
    public:
            void method1()
            {
                std::cout<<"SubSystem1::method1 invoke"<<std::endl;
            }
};

class SubSystem2
{
    public:
            void method2()
            {
                std::cout<<"SubSystem2::method2 invoke"<<std::endl;
            }
};

class SubSystem3
{
    public:
            void method3()
            {
                std::cout<<"SubSystem3::method3 invoke"<<std::endl;
            }
};

class Facade
{
        public:
                Facade()
                {
                    subSystem1=new SubSystem1();
                    subSystem2=new SubSystem2();
                    subSystem3=new SubSystem3();
                }
                void methodA()
                {
                    std::cout<<"Facade methodA include:"<<std::endl;
                    subSystem1->method1();
                    subSystem2->method2();
                }
                void methodB()
                {
                    std::cout<<"Facade methodB include:"<<std::endl;
                    subSystem1->method1();
                    subSystem3->method3();
                }
                ~Facade()
                {
                    if(subSystem1!=NULL)
                            delete subSystem1;
                    if(subSystem2!=NULL)
                            delete subSystem2;
                    if(subSystem3!=NULL)
                            delete subSystem3;
                }
        private:
                SubSystem1 * subSystem1;
                SubSystem2 * subSystem2;
                SubSystem3 * subSystem3;
};

int main()
{
    std::cout<<"外观模式测试"<<std::endl;
    Facade * facade=new Facade;
    facade->methodA();
    facade->methodB();
    delete facade;
    return 0;
}

执行结果:

一个具体的例子:

Facade为Morgage,这个类用来判断能否对客户抵押贷款(根据客户的银行账户,行用卡记录,贷款记录来判断)。

SubSystem包括Bank(即客户的银行账户是否满足要求),Credit(客户的信用卡是否符合要求),Loan(客户的是否存在不良贷款记录)。

C++代码如下:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string>
using namespace std;
class Customer
{
        public:
        Customer(string str=""):name(str)
        {

        }
        string getName() const
        {
                return name;
        }
        void setName(string str)
        {
            name=str;
        }

        private:
                string name;

};

class Bank
{
        public:
                bool hasSufficientSavings(Customer c,int amount)
                {
                    std::cout<<"check bank for "<<c.getName()<<std::endl;
                    return true;
                }
};

class Credit
{
        public:
                bool hasGoodCredit(Customer c)
                {
                    std::cout<<"check credit for "<<c.getName()<<std::endl;
                    return true;
                }
};

class Loan
{
        public:
                bool hasNoBadLoans(Customer c)
                {
                    std::cout<<"check loans for "<<c.getName()<<std::endl;
                    return true;
                }
};

class Mortgage
{
        public:
                Mortgage()
                {
                    bank=new Bank;
                    credit=new Credit;
                    loan=new Loan;
                }
                bool isEligible(Customer c, int amount)
                {
                    std::cout<<c.getName()<<" applies for "<<amount<<std::endl;
                    bool eligible=true;
                    if(!bank->hasSufficientSavings(c,amount))
                    {
                        eligible=false;
                    }
                    else if(!credit->hasGoodCredit(c))
                    {
                        eligible=false;
                    }
                    else if(!loan->hasNoBadLoans(c))
                    {
                        eligible=false;
                    }

                    return eligible;

                }
                ~Mortgage()
                {
                    if(!bank)
                            delete bank;
                    if(!credit)
                            delete credit;
                    if(!loan)
                            delete loan;
                }
        private:
                Bank * bank;
                Credit *credit;
                Loan * loan;
};

int main()
{
    std::cout<<"外观模式具体例子"<<std::endl;
    Mortgage *mortgage=new Mortgage();
    Customer c(string("John"));
    bool eligible =mortgage->isEligible(c,25000);

    std::cout<<c.getName()<<" has been "<<(eligible?"approve":"reject")<<std::endl;
    return 0;
}

执行结果:

外观模式是一个对迪米特法则很好的应用。

迪米特法则:

如果两个类不必直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

这也是降低耦合性的思想。

时间: 2024-08-04 01:32:41

设计模式之八:外观模式(Facade)的相关文章

设计模式之外观模式(Facade)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

二十四种设计模式:外观模式(Facade Pattern)

外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 示例有一个Message实体类,某对象对它的操作有Get()方法,另外还有一个对象有一个Validate()方法来判断用户是否有权限.现在提供一个高层接口来封装这两个方法. MessageModel using System; using System.Collections.Generic; using System.Text; nam

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

1.模式动机 在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了. 软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂.这时如果系统内部发生改变,客户端也要跟着改变,这违背了"开闭原则",也违背了"迪米特法则(最少知道原则)",所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标. 2.模式定义 外观模式(F

Java 设计模式:外观模式Facade

Facade 外观模式 外观模式----为子系统的一组接口提供一个统一的界面,此模式定义了一个更高层的接口,这一接口使得子系统更容易使用. 借用<大话设计模式>中的例子:市场上有N多只股票,当股民想要买股票时为了最大化自己的收益需要考察市面上很多种类的股票,然后根据自己的判断选取几只股票组合购买(这种场景下每一只股票都是可以单独购买的,用户需要考察.选取一组股票来一起购买).而有的用户直接购买基金,基金的作用是帮用户选取几只股票来组合购买,用户不用自己去选取多只股票. 在这个场景下:单独的购买

设计模式 笔记 外观模式 Facade

//---------------------------15/04/16---------------------------- //Facade 外观模式-----对象结构型模式 /* 1:意图: 为子系统的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得 这一子系统更加容易使用. 2:动机: 3:适用性: 1>当你要为一个复杂子系统提供一个简单接口时. 子系统往往因为不断演化而变得越来越复杂.大多数模式使用时都会产生更多更小的类. 这使得子系统更具可重用性,也更

【设计模式】—— 外观模式Facade

前言:[模式总览]——————————by xingoo 模式意图 外观模式主要是为了为一组接口提供一个一致的界面.从而使得复杂的子系统与用户端分离解耦. 有点类似家庭常用的一键开关,只要按一个键,台灯卧室客厅的灯都亮了.虽然他们各有各自的开关,但是对外用一个来控制. 应用场景 1 为复杂系统 提供简单的接口. 2 客户程序与抽象类的实现部分分离. 3 构建层次系统时,用作入口. 模式结构 Facade 对外的统一接口 class Facade{ public void operation(){

设计模式(10) 外观模式(FACADE)

问题聚焦: 设计一个系统时,比较常见的做法是将它划分为若干个小的系统,互相协作,组成一个大的系统. 那么,在设计这些小系统时,需要注意一些什么呢? 外观模式为什么可以让子系统更加容易的使用呢?(最小化子系统之间的通信和相互依赖关系,即降低耦合度) 意图: 为子系统中的一组接口提供一个一致的界面.Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 动机: 将一个系统划分为若干个子系统有利于降低系统的复杂性. 一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小. 达到该

设计模式之外观模式 Facade

代码实现 public interface Bank { void lend(); } class WuHanBank implements Bank{ @Override public void lend() { System.out.println("银行借钱"); } } public interface KFS { void signContract(); } class Wanke implements KFS{ @Override public void signContr

Objective C设计模式之外观模式facade

一个框架中如果包含的类比较多,或者功能比较复杂的情况下,可以通过一个较辅助类为一些常用的情况提供简单的接口.这样客户在使用这个框架的时候既可以比较简单的应付常见的场景,又可以使用框架中的内实现符合自己要求的功能.这就好比买电脑的时候,即可以买品牌机,又可以自己买配件组装.下面就拿买电脑来举例. 假设电脑由显示器.主板.CPU.内存和显卡组成.当然,实际远远不止这些.每个设备都有许多的参数需要选择,我们给它们分别定义一个类去完成选择的工作. //选择显示器@interface Display : 

设计模式 - 外观模式(facade pattern) 详解

外观模式(facade pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 外观模式(facade pattern): 提供了一个统一的接口, 用来访问子系统中的一群接口. 外观定义了一个高层接口, 让子系统更容易使用. 外观模式包含三个部分: 1. 子系统: 子类, 单个复杂子类 或 多个子类; 2. 外观(facade)类: 把子系统设计的更加容易使用; 3. 客户: 只需要调用外观类. 与适配器模式(adapter pattern)的