我的实用设计模式之 关于Policy-based design在Windows Mobile网络连接管理的应用
Raw Data原数据使用不要的分析器分析器使用不同的算法分析出关心的Event事件对象告警等等。同时作为behavior模式之一stragety模式也可以使用在 定义多个behaviors行为在C#中可以为method或者property来代替大量的条件语句if else或者switch的情景。下面是用案例论述有一个Windows Mobile的手机系统需要定期往服务器提交数据在数据传输时需要网络连接由于这个手机支持3G和Wifi因此可以通过多种硬件连接进行数据提交。下面是一个没有用到OO的设计。public enum ConnectionType{Wifi,ThreeG}public class DataSubmitter{public ConnectionType connectionType;public void SubmitData(){if(!CheckConnection()){MakeConnection();}//submit dataStopConnection();}public bool CheckConnection(){switch(connectionType){case ConnectionType.Wifi:CheckWifiConnection();break;case ConnectionType.ThreeG:CheckThreeGConnection();break;}}public bool MakeConnection(){switch(connectionType){case ConnectionType.Wifi:MakeWifiConnection();break;case ConnectionType.ThreeG:MakeThreeGConnection();break;}}public bool StopConnection(){switch(connectionType){case ConnectionType.Wifi:StopWifiConnection();break;case ConnectionType.ThreeG:StopThreeGConnection();break;}}}数据提交程序Client每次提交数据都需要调用CheckConnection,MakeConnection如果需要StopConnection这些behaviors.但是由于硬件连接有多种需要使用条件语句(if else或者switch case)来表达不同behavior。如果新增一种新的网络连接方式例如新增GPRS那么需要修改client来完成。试想一下应用程序应该不关心具体的网络连接例如msn和QQ不管Windows的连接这个链接可能是wifi可能是有线网络可能是拨号。作为上层应用的msn和QQ不会关心这些具体网络连接技术msn更加不可能需要修改程序来支持新的网络连接方式。为了解决这个问题我们引进Strategy模式。public enum ConnectionType{Wifi,ThreeG,Gprs}//strategypublic interface Connection{//behaviorsbool Connect();bool Disconnect();bool IsConnected {get;}}public class WifiConnection : Connection{public bool Connect(){//invoke wifi api to make connectionreturn true;}public bool Disconnect(){//invoke wifi api to stop connectionreturn true;}public bool IsConnected{get{//invoke wifi api to check connectionreturn true;}}}public class ThreeGConnection : Connection{public bool Connect(){//invoke ThreeG api to make connectionreturn true;}public bool Disconnect(){//invoke ThreeG api to stop connectionreturn true;}public bool IsConnected{get{//invoke ThreeG api to check connectionreturn true;}}}public class GprsConnection : Connection{public bool Connect(){//invoke Gprs api to make connectionreturn true;}public bool Disconnect(){//invoke Gprs api to stop connectionreturn true;}public bool IsConnected{get{//invoke Gprs api to check connectionreturn true;}}}//Contextpublic class ConnectionManager{private DictionaryConnectionType, Connection connections;private Connection currentConnection;public ConnectionManager(){foreach(setting from configurations) // this is fake code{ConnectionType type; // get from configurationsconnections[type] ConnectionFactory.CreateConnection(type);}}public bool CheckConnection(){//according to specific requirement, pick up one of connections to connectcurrentConnection connections[ConnectionType.Wifi];return currentConnection.Connect();}public bool MakeConnection(){return currentConnection.Disconnect();}public bool StopConnection(){return currentConnection.IsConnected;}}//connection factorypublic sealed class ConnectionFactory{public static Connection CreateConnection(ConnectionType connectionType){try{System.Reflection.Assembly asm System.Reflection.Assembly.GetExecutingAssembly();Type type typeof(ConnectionFactory);return (Connection)asm.CreateInstance(type.Namespace . connectionType.ToString() Connection);}catch (Exception e){Console.WriteLine(e.Message);}return null;}}//clientpublic class DataSubmitter{public ConnectionManager connectionMgr;public void SubmitData(){if(!connectionMgr.CheckConnection()){connectionMgr.MakeConnection();}//submit dataconnectionMgr.StopConnection();}}Connection是Strategy父类定义需要实现的behaviors在C#里面是method和propertyConnectionManager是Context负责管理各
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2471673.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!