当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 无废话C#设计模式之八:Facade

ASP.NET
赫赫大名的A*寻路算法(vb.net版本)
asp.net(c#)下Jmai去说明 使用与下载
[原创]完美解决Could not load file or assembly ''AjaxPro.2'' or one of its dependencies. 拒绝访问。
asp.net下gridview 批量删除的实现方法
用CSS实现图片倾斜 只支持IE
.net get set用法小结
vs 不显示行号的操作方法
ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)
ASP.Net不执行问题一解
asp.net 无限分类
让VS2008对JQuery语法的智能感知更完美一点
扩展方法ToJSON() and ParseJSON()
asp.net下PageMethods使用技巧
Linq to SQL Delete时遇到问题的解决方法
实现ASP.NET多文件上传程序代码
ASP.NET AJAX 1.0 RC开发10分钟图解
asp.net get set用法
ASP.NET下使用WScript.Shell执行命令
asp.net2.0实现邮件发送(测试成功)
Asp.net 无限级分类实例代码

ASP.NET 中的 无废话C#设计模式之八:Facade


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 140 ::
收藏到网摘: n/a

  本系列文章将向大家介绍一下C#的设计模式,此为第八篇文章,相信对大家会有所帮助的。废话不多说,继续来看。

  意图

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

  场景

  在一个为游戏充值的网站中,创建订单需要与三个外部接口打交道:

  用户系统:根据用户名获取用户ID、查看用户是否已经激活了游戏

  卡系统:查看某种类型的充值卡是否还有库存

  充值系统:创建一个订单,并且返回订单号

  如果直接让网站和三个外部接口发生耦合,那么网站因为外部系统接口修改而修改的概率就很大了,并且就这些小接口来说并不是十分友善,它们提供的大多数是工具方法,具体怎么去使用还是要看充值网站创建订单的逻辑。

  Facade的思想就是在小接口上封装一个高层接口,屏蔽子接口的调用,提供外部更简洁,更易用的接口。

  示例代码

以下为引用的内容:

  using System;
  using System.Collections.Generic;
  using System.Text;
  namespace FacadeExample
  {
  class Program
  {
  static void Main(string[] args)
  {
  PayFacacde pf = new PayFacacde();
  Console.WriteLine("order:" + pf.CreateOrder("yzhu", 0, 1, 12) + " created");
  }
  }
  class PayFacacde
  {
  private AccountSystem account = new AccountSystem();
  private CardSystem card = new CardSystem();
  private PaySystem pay = new PaySystem();
  public string CreateOrder(string userName, int cardID, int cardCount, int areaID)
  {
  int userID = account.GetUserIDByUserName(userName);
  if (userID == 0)
  return string.Empty;
  if (!account.UserIsActived(userID, areaID))
  return string.Empty;
  if (!card.CardHasStock(cardID, cardCount))
  return string.Empty;
  return pay.CreateOrder(userID, cardID, cardCount);
  }
  }
  class AccountSystem
  {
  public bool UserIsActived(int userID, int areaID)
  {
  return true;
  }
  public int GetUserIDByUserName(string userName)
  {
  return 123;
  }
  }
  class CardSystem
  {
  public bool CardHasStock(int cardID, int cardCount)
  {
  return true;
  }
  }
  class PaySystem
  {
  public string CreateOrder(int userID, int cardID, int cardCount)
  {
  return "0000000001";
  }
  }
  }

  代码说明

  PayFacade类就是门面类型,提供给客户端调用,它本身调用子接口。可以看到,创建一个订单首先要根据用户名获取用户ID、然后要看用户是否已经激活了游戏、然后看充值卡是否有库存,最后才是创建订单。

  AccountSystem、CardSystem以及PaySystem就是子接口,它们提供了账户、卡以及充值相关的一些接口方法。

  Facade模式太常用了,把和多方关联的逻辑代码再进行一次封装,提供一个高层接口就是Facade的思想。比如在做论坛程序的时候,一些操作需要调用权限访问模块(发帖、管理帖子),另外一些操作可以直接调用(首页论坛板块、登陆)数据访问模块,由网站来做这个判断并调用不同的子模块并不合适,可以加一个业务逻辑层来统一接受网站各种操作请求,这其实就是Facade。

  何时采用

  从代码角度来说, 如果你的程序有多个类是和一组其它接口发生关联的话可以考虑在其中加一个门面类型。

  从应用角度来说, 如果子系统的接口是非常细的,调用方也有大量的逻辑来和这些接口发生关系,那么就可以考虑使用Facade把客户端与子系统的直接耦合关系进行化解。你可能会说,子系统改了门面不是照样改?的确是需要改,但是如果客户端本身的工作已经比较复杂,或者说可能有多个需要调用门面的地方,这个时候门面的好处就体现了。

  实现要点

  通过一个高层接口让子系统和客户端不发生直接关联,使客户端不受子系统变化的影响。

  Facade不仅仅针对代码级别,在构架上,特别是WEB应用程序的构架上,Facade的应用非常普遍。

  注意事项

  Facade不一定只能是一个,可以考虑把门面进行细分。