C++ Programmer's Cookbook

{C++ 基础} {C++ 高级} {C#界面,C++核心算法} {设计模式} {C#基础}

模式设计c#--结构型--facade

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

Code Example
namespace Facade_DesignPattern
{
    
using System;

    
class SubSystem_class1 
    
{
        
public void OperationX() 
        
{
            Console.WriteLine(
"SubSystem_class1.OperationX called");
        }

    }


    
class SubSystem_class2
    
{
        
public void OperationY()
        
{
            Console.WriteLine(
"SubSystem_class2.OperationY called");
        }

    }


    
class SubSystem_class3 
    
{
        
public void OperationZ()
        
{            
            Console.WriteLine(
"SubSystem_class3.OperationZ called");
        }
    
    }


    
class Facade 
    
{
        
private SubSystem_class1 c1 = new SubSystem_class1();
        
private SubSystem_class2 c2 = new SubSystem_class2();
        
private SubSystem_class3 c3 = new SubSystem_class3();

        
public void OperationWrapper()
        
{
            Console.WriteLine(
"The Facade OperationWrapper carries out complex decision-making");
            Console.WriteLine(
"which in turn results in calls to the subsystem classes");
            c1.OperationX();
            
if (1==1 /*some really complex decision*/)
            
{
                c2.OperationY();
            }

            
// lots of complex code here . . .
            c3.OperationZ();
        }

        
    }


    
/// <summary>
    
///    Summary description for Client.
    
/// </summary>

    public class Client
    
{
          
public static int Main(string[] args)
        
{
            Facade facade 
= new Facade();
            Console.WriteLine(
"Client calls the Facade OperationWrapper");
            facade.OperationWrapper();      
            
return 0;
        }

    }

}


一个实际生活的例子:
// Facade pattern -- Real World example  


using System;

namespace DoFactory.GangOfFour.Facade.RealWorld
{
  
// MainApp test application 

  
class MainApp
  
{
    
static void Main()
    
{
      
// Facade 
      Mortgage mortgage = new Mortgage();

      
// Evaluate mortgage eligibility for customer 
      Customer customer = new Customer("Ann McKinsey");
      
bool eligable = mortgage.IsEligible(customer,125000);
      
      Console.WriteLine(
"\n" + customer.Name + 
          
" has been " + (eligable ? "Approved" : "Rejected"));

      
// Wait for user 
      Console.Read();
    }

  }


  
// "Subsystem ClassA" 

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

  }


  
// "Subsystem ClassB" 

  
class Credit
  
{
    
public bool HasGoodCredit(Customer c)
    
{
      Console.WriteLine(
"Check credit for " + c.Name);
      
return true;
    }

  }


  
// "Subsystem ClassC" 

  
class Loan
  
{
    
public bool HasNoBadLoans(Customer c)
    
{
      Console.WriteLine(
"Check loans for " + c.Name);
      
return true;
    }

  }


  
class Customer
  
{
    
private string name;

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


    
// Property 
    public string Name
    
{
      
getreturn name; }
    }

  }


  
// "Facade" 

  
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;
    }

  }

}
 
Output
MethodA() ----
SubSystemOne Method
SubSystemTwo Method
SubSystemFour Method

MethodB() ----
SubSystemTwo Method
SubSystemThree Method

posted on 2006-01-03 15:48 梦在天涯 阅读(840) 评论(1)  编辑 收藏 引用 所属分类: Design pattern

评论

# re: 模式设计c#--结构型--facade 2006-04-24 15:17 梦在天涯

在什么情况下使用门面模式
为一个复杂子系统提供一个简单接口
提高子系统的独立性
在层次化结构中,可以使用Facade模式定义系统中每一层的入口。
  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

EMail:itech001#126.com

导航

统计

  • 随笔 - 461
  • 文章 - 4
  • 评论 - 746
  • 引用 - 0

常用链接

随笔分类

随笔档案

收藏夹

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

积分与排名

  • 积分 - 1783931
  • 排名 - 5

最新评论

阅读排行榜