简介数据库
外观模式(Facade),将外部与内部子系统的通讯经过一个统一的门面对象进行。spa
由两部分组成:code
具体实例对象
交易的保存,交易的保存涉及到交易自己数据库表的保存、余额的调整、交易修改备案的记录等操做。接口
相关子类的代码为:string
/// <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); } }
若是每一个客户端保存交易时,每次都依次调用上述代码,会使客户端显得累赘,代码可读性变差。it
代码为:class
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.在层次化结构中,可使用外观模式定义每一层的入口。