关闭

设计模式与实例代码:Facade模式

标签: 设计模式classconstructorstring数据库dao
923人阅读 评论(0) 收藏 举报
分类:

意图:希望简化原有系统的使用方式,需要定义自己的接口

问题:只需要使用某个复杂系统的子集,或者需要以一种特殊的方式与系统交互

解决方案:Facade为原有系统的客户提供一个新的接口,有可能减少客户所需要处理的对象数量

参与者与协作 者:为客户提供了一个简化接口,使用系统容易使用

效果:Facade模式简化了对所需要子系统的使用过程。但是,由于Facade并不完整,因此客户可能无法使用某些功能。子系统中的类不知道Facade的存在,也不会保存其引用。

实现 :定义一个具备所需要接口的新类,让新类使用原有的系统

附注:如果除了使用系统原有功能之外,还需要提供一些新功能,则可以为Facade类增加新的功能,这仍然是Facade模式。

Facade模式可以用来 隐藏或封装系统,可以在其中跟踪系统的使用情况或者改换系统。

Facade模式的使用十分的广泛,例如PHP的DAO层就是一个Facade,封装了对数据库的访问接口,应用不需要自己去处理数据库的各处底层处理。此外现实生活中,银行窗口就是银行复杂系统的一个Facade。

using System;
 
namespace Facade
{
  /// <summary>
  /// MainApp startup class for Real-World
  /// Facade Design Pattern.
  /// </summary>
  class MainApp
  {
    /// <summary>
    /// Entry point into console application.
    /// </summary>
    static void Main()
    {
      // Facade
      Mortgage mortgage = new Mortgage();
 
      // Evaluate mortgage eligibility for customer
      Customer customer = new Customer("Ann McKinsey");
      bool eligible = mortgage.IsEligible(customer, 125000);
 
      Console.WriteLine("\n" + customer.Name +
          " has been " + (eligible ? "Approved" : "Rejected"));
 
      // Wait for user
      Console.ReadKey();
    }
  }
 
  /// <summary>
  /// The 'Subsystem ClassA' class
  /// </summary>
  class Bank
  {
    public bool HasSufficientSavings(Customer c, int amount)
    {
      Console.WriteLine("Check bank for " + c.Name);
      return true;
    }
  }
 
  /// <summary>
  /// The 'Subsystem ClassB' class
  /// </summary>
  class Credit
  {
    public bool HasGoodCredit(Customer c)
    {
      Console.WriteLine("Check credit for " + c.Name);
      return true;
    }
  }
 
  /// <summary>
  /// The 'Subsystem ClassC' class
  /// </summary>
  class Loan
  {
    public bool HasNoBadLoans(Customer c)
    {
      Console.WriteLine("Check loans for " + c.Name);
      return true;
    }
  }
 
  /// <summary>
  /// Customer class
  /// </summary>
  class Customer
  {
    private string _name;
 
    // Constructor
    public Customer(string name)
    {
      this._name = name;
    }
 
    // Gets the name
    public string Name
    {
      get { return _name; }
    }
  }
 
  /// <summary>
  /// The 'Facade' class
  /// </summary>
  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;
 
      // Check creditworthyness of applicant
      if (!_bank.HasSufficientSavings(cust, amount))
      {
        eligible = false;
      }
      else if (!_loan.HasNoBadLoans(cust))
      {
        eligible = false;
      }
      else if (!_credit.HasGoodCredit(cust))
      {
        eligible = false;
      }
 
      return eligible;
    }
  }
}

在上面的例子中Mortgage(借贷)是一个银行系统的Facade,它向用户隐藏了系统后台的各个类,如存款、信用、不良欠款等信息,只向外界提供一个判断用户是否拥有资质的接口,一方面减化了对系统的使用,另一方面也对用户和系统内部的多个类进行了解耦。


0
0
查看评论

23种设计模式(1)-Facade设计模式

前记        曾经我遇见的一个需求是这样的,接口A有个方法void methodA(),类B需要实现接口A的methodA()方法,并且在类B中需要把methodA()方法内部处理逻辑获得的结果利用C类实例的某个...
  • duchao123duchao
  • duchao123duchao
  • 2016-05-16 14:47
  • 3388

Facade模式详解--设计模式(11)

Facade模式 一 意图   为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 二 动机   将一个系统划分成为若干个子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。 达到该目标的途...
  • fanyun_01
  • fanyun_01
  • 2016-06-29 08:57
  • 1349

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

     一个良好的面向对象应用程序应该是一个最小的类,这个类能够把其他可重用类的行为有效的组织起来。对一个子系统的类进行重构,直到每个类都有一个进行良好定义功能目标,所以代码易于维护。外观模式(Facade)的目的是提供一个接口,通过这个接口可以使一个子系统...
  • scucj
  • scucj
  • 2006-11-09 00:22
  • 3210

浅谈JAVA设计模式之——外观模式(Facade)

一、概述 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 二、适用性 1.当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越 复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容 易对...
  • l1028386804
  • l1028386804
  • 2015-05-07 23:32
  • 3356

一天学习两个设计模式之Facade模式(外观模式,结构型模式)

一天学习两个设计模式之Facade模式(外观模式,结构型模式)
  • Dax1n
  • Dax1n
  • 2017-05-03 19:36
  • 388

Java 设计模式 之 facade(外观)设计模式

Facade模式要求一个子系统的外部与其内部的通信通过一个统一的Facade对象进行。Facade模式提供一个高层次的接口,使得子系统更易于使用。       当子系统经过不断的演变,变得异常复杂时,这时候,为了让子系统能够工作,这就要求 客户端对子...
  • u010349169
  • u010349169
  • 2014-01-28 17:24
  • 2922

JAVA设计模式十九--Facade(外观模式)

Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用。 Facade模式概述         实际应用中,我们在对付一些老旧的code(尤其是将C的代码转成C++代...
  • hfmbook
  • hfmbook
  • 2012-06-29 15:25
  • 18472

pureMVC与设计模式之二. Facade模式与Singleton模式

引言 上篇文章,我们分析了pureMVC的结构以及工作流。从本文开始,将逐个解剖其中设计到的设计模式。我们先看facade模式和singleton模式。 一、pureMVC中的Facade模式 1. facade模式介绍 Façade模式的理论基础是迪米特法则(Law of ...
  • ywjun0919
  • ywjun0919
  • 2015-05-05 10:04
  • 576

Java设计模式(四) Facade(门面)模式及Tomcat引申

基本概念Facade的概念为子系统中的一组接口提供一个统一接口。Facade模式定义了一个更高层的接口,使子系统更加容易使用。 我们需要以一种比原有方式更简单直接的办法与系统交互,对于讨论的复杂系统我们只有针对性地使用它的一个子集 因为Facade模式可以封装多个子系统,可以减少客户必须处理的对象的...
  • qq_24451605
  • qq_24451605
  • 2016-04-25 14:38
  • 4646

设计模式(七)门面模式(Facade Pattern 外观模式)

一、模式定义门面模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。门面模式又称为外观模式,它是一种对象结构型模式。二、模式动机现代的软件系统都非常复杂,尽...
  • xingjiarong
  • xingjiarong
  • 2015-11-28 16:14
  • 7681
    关注我
    微信关注

    打赏
    个人资料
    • 访问:828021次
    • 积分:8497
    • 等级:
    • 排名:第2770名
    • 原创:174篇
    • 转载:57篇
    • 译文:1篇
    • 评论:62条
    最新评论