简介
外观模式(Facade),将外部与内部子系统的通信通过一个统一的门面对象进行。
由两部分组成:
- 门面角色:供外部调用,内部可能组装了多个子系统,多个方法。
- 子系统角色:子系统的方法也可以直接供外部调用。一般来说,将常用的方法放在门面角色里面调用,门面角色对其来说相当于一个客户端而已。
具体实例
交易的保存,交易的保存涉及到交易本身数据库表的保存、余额的调整、交易修改备案的记录等操作。
相关子类的代码为:
/// <summary> /// 交易保存类--子系统1 /// </summary> class TradeManager { public void SaveTrade(Trade aTrade) { Console.WriteLine("交易编号为{0}的交易保存成功", aTrade.NO); } } /// <summary> /// 交易修改备案类--子系统2 /// </summary> public class TradeDiffManager { public void DiffTrade(Trade aTrade) { Console.WriteLine("交易编号为{0}的交易修改备案保存成功", aTrade.NO); } } /// <summary> /// 交易余额记账类--子系统3 /// </summary> public class TradeClearManager { public void ClearTrade(Trade aTrade) { Console.WriteLine("交易编号为{0}的交易余额记账成功", aTrade.NO); } }
如果每个客户端保存交易时,每次都依次调用上述代码,会使客户端显得累赘,代码可读性变差。
代码为:
public class ClientTest { public static void Main(string[] args) { Trade trade = new Trade(); trade.NO = 100; TradeManager tradeManager = new TradeManager(); tradeManager.SaveTrade(trade); TradeDiffManager tradeDiffManager = new TradeDiffManager(); tradeDiffManager.DiffTrade(trade); TradeClearManager tradeClearManager = new TradeClearManager(); tradeClearManager.ClearTrade(trade); Console.ReadLine(); } }
使用外观模式,将本来在客户端依次调用的一组方法放在门面角色里面统一处理。
代码为:
public class FacadeClass { public void SaveTrade(Trade aTrade) { TradeManager tradeManager = new TradeManager(); tradeManager.SaveTrade(aTrade); TradeDiffManager tradeDiffManager = new TradeDiffManager(); tradeDiffManager.DiffTrade(aTrade); TradeClearManager tradeClearManager = new TradeClearManager(); tradeClearManager.ClearTrade(aTrade); } } public class ClientTest { public static void Main(string[] args) { Trade trade = new Trade(); trade.NO = 100; FacadeClass facade = new FacadeClass(); facade.SaveTrade(trade); Console.ReadLine(); } }
补充分析
1.门面类(即上文中的FacadeClass)本身可以很多个,针对不同用途,对子系统的各个方法进行组装。
2.一般来说,门面类只有一个实例(上面为了简单起见,没有把门面类定义为Singleton)
3.门面类本身一般没有实现代码,只是为各个子系统提供一个集中的调用接口。
优点:
1.为复杂的子系统提供一个简单接口。
2.提供子系统的独立性。子系统不需要知道门面类,门面类只是他的一个客户端而已。子系统本身的方法也可以直接供外面调用。
3.在层次化结构中,可以使用外观模式定义每一层的入口。