本文转自:http://hi.baidu.com/grayworm
该模式正是我目前做的产品的设计模式。
当一个子系统里有复杂的业务逻辑处理的时候,客户程序需要深入到子系统内部去了解其中的运作过程,这样会给客户程序的开发人员带来很大的麻烦。遇到这种情况我们如果使用门面模式问题就会迎刃而解。
门面模式就是在客户程序和子系统之间提供一个一致的代码调用界面,客户程序只与门面模块交互,不需要了解子系统的运作。
例子:
和尚化缘:如果和尚饿了,去一大户人家门前化缘讨口饭吃,现在和尚就是"客户程序",大户人家的大院是"子系统",看门的门丁是"门面"。当然不能允许和尚直接进入大院去找吃的,就算你允许他进去找吃的,侯门深似海,怕是和尚在找到厨房之前就饿晕了。所以和尚一般会采用"门面模式"去化缘,他会向门丁化缘,然后门丁去院内给他找吃的,究竟这位门丁如何给和尚找到吃的,和尚并不关心。这样就简化了客户程序了。
网上购物下定单:当你在网上购物完成下定单的时候,会涉及到很多的操作,如:第一步要计算要买的商品的总价格,第二步再检查"用户帐户表"看看用户的帐户余额是否,第三步再检查“商品表”中的货架是否充足,第四步是一个事务操作:把用户账户减去商品价格,把商品数据减去卖出的数量,把订单插入到“订单表”里去。看到这里可能有的人会感觉有点眼晕,如果这些操作让用户界面的程序员去一一实现的话,那实在太难为他了。如果采用门面模式的话,如图所示,用户界面程序员只需与“订单门面”沟通就可以了。
代码实现如下:
class Users
{
public void CheckMoney()
{
Console.WriteLine("Checking User's Account......");
}
public void CutDownMoney()
{
Console.WriteLine("Cutting Down User's Account......");
}
}
class Products
{
public void CheckProduct()
{
Console.WriteLine("Checking The Quantity of Products......");
}
public void CutDownProducts()
{
Console.WriteLine("Reduce The Quantity of Products......");
}
}
class Orders
{
public void AddOrders()
{
Console.WriteLine("Now Is Adding The Orders......");
}
}
class Facade
{
private Users user;
private Products prod;
private Orders order;
public Facade()
{
user = new Users();
prod = new Products();
order = new Orders();
}
public void OrderProduct()
{
user.CheckMoney();
prod.CheckProduct();
user.CutDownMoney();
prod.CutDownProducts();
order.AddOrders();
}
}
class Client
{
public static void Main()
{
Facade f = new Facade();
f.OrderProduct();
}
}
运行结果
在以下情况下应考虑使用门面模式:
为一个复杂子系统提供一个简单接口
提高子系统的独立性
在层次化结构中,可以使用Facade模式定义系统中每一层的入口。