专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程思想 » windowsmobile:实用设计模式的 2--Strategy模式续 Strategy模式在Windows Mobile网络连接管理的应用 »正文

windowsmobile:实用设计模式的 2--Strategy模式续 Strategy模式在Windows Mobile网络连接管理的应用

来源: 发布时间:星期三, 2009年9月2日 浏览:47次 评论:0
  本文主要讲述Strategy模式在Windows Mobile网络连接管理应用经过实用设计模式的 2--Strategy模式讨论对Strategy模式进步研究有了些新认识Strategy模式使用最为广泛情景是封装区别算法使得客户端不关心具体算法处理因此我使用stragety模式最多是在 Analysis Engine(分析引擎)根据Raw Data(原数据)使用不要分析器(分析器使用区别算法)分析出关心Event(事件对象告警等等)同时作为behavior模式的stragety模式也可以使用在 定义多个behaviors(行为在C#中可以为method或者property)来代替大量条件语句( 或者switch)情景

  下面是用案例论述个Windows Mobile手机系统需要定期往服务器提交数据在数据传输时需要网络连接由于这个手机支持3G和Wi因此可以通过多种硬件连接进行数据提交下面是个没有用到OO设计

public enum ConnectionType
{
    Wi,
    ThreeG
}

public  DataSubmitter
{
    public ConnectionType connectionType;
    public void SubmitData
    {
        (!CheckConnection)
        {
            MakeConnection;
        }
        
        //submit data
        
        StopConnection;
        
    }
    
    public bool CheckConnection
    {
        switch(connectionType)
        {
             ConnectionType.Wi:
                CheckWiConnection;
            ;
             ConnectionType.ThreeG:
                CheckThreeGConnection;
            ;
            
        }
    }
    
    public bool MakeConnection
    {
        switch(connectionType)
        {
             ConnectionType.Wi:
                MakeWiConnection;
            ;
             ConnectionType.ThreeG:
                MakeThreeGConnection;
            ;
            
        }
    }
    
    public bool StopConnection
    {
        switch(connectionType)
        {
             ConnectionType.Wi:
                StopWiConnection;
            ;
             ConnectionType.ThreeG:
                StopThreeGConnection;
            ;
            
        }
    }
        
}


  数据提交(Client)每次提交数据都需要CheckConnection,MakeConnection(如果需要)StopConnection这些behaviors.但是由于硬件连接有多种需要使用条件语句( 或者switch )来表达区别behavior如果新增种新网络连接方式例如新增GPRS那么需要修改client来完成试想下应用应该不关心具体网络连接例如msn和QQ不管Windows连接这个链接可能是wi可能是有线网络可能是拨号作为上层应用msn和QQ不会关心这些具体网络连接技术msn更加不可能需要修改来支持新网络连接方式为了解决这个问题我们引进Strategy模式



    public enum ConnectionType
    {
        Wi,
        ThreeG,
        Gprs
    }

    //strategy
    public erface Connection
    {
        //behaviors
        bool Connect;
        bool Disconnect;
        bool IsConnected {get;}
    }

    public  WiConnection : Connection
    {
        public bool Connect
        {
            //invoke wi api to make connection
             true;
        }
        public bool Disconnect
        {
            //invoke wi api to stop connection
             true;
        }

        public bool IsConnected 
        {
            get
            {
                //invoke wi api to check connection
                 true;
            } 
        }
    }

    public  ThreeGConnection : Connection
    {
        public bool Connect
        {
            //invoke ThreeG api to make connection
             true;
        }
        public bool Disconnect
        {
            //invoke ThreeG api to stop connection
             true;
        }

        public bool IsConnected
        {
            get
            {
                //invoke ThreeG api to check connection
                 true;
            }
        }
    }

    public  GprsConnection : Connection
    {
        public bool Connect
        {
            //invoke Gprs api to make connection
             true;
        }
        public bool Disconnect
        {
            //invoke Gprs api to stop connection
             true;
        }

        public bool IsConnected
        {
            get
            {
                //invoke Gprs api to check connection
                 true;
            }
        }
    }

    //Context
    public  ConnectionManager
    {
        private Dictionary<ConnectionType, Connection> connections;
        private Connection currentConnection;

        public ConnectionManager
        {
            foreach(ting from configurations) // this is fake code
            {
                ConnectionType type; // get from configurations
                connections[type] = ConnectionFactory.CreateConnection(type);
            }
        }

        public bool CheckConnection
        {
            //according to specic requirement, pick up one of connections to connect
            currentConnection = connections[ConnectionType.Wi];
             currentConnection.Connect;
        }

        public bool MakeConnection
        {
             currentConnection.Disconnect;

        }

        public bool StopConnection
        {
             currentConnection.IsConnected;
        }
    }

    //connection factory
    public sealed  ConnectionFactory
    {
        public  Connection CreateConnection(ConnectionType connectionType)
        {
            try
            {
                .Reflection.Assembly asm = .Reflection.Assembly.GetExecutingAssembly;
                Type type = typeof(ConnectionFactory);
                 (Connection)asm.CreateInstance(type.Namespace + "." + connectionType. + "Connection");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
             null;
        }
    }

    //client
    public  DataSubmitter
    {
        public ConnectionManager connectionMgr;
        public void SubmitData
        {
            (!connectionMgr.CheckConnection)
            {
                connectionMgr.MakeConnection;
            }
            
            //submit data
            
            connectionMgr.StopConnection;
        }
    }




  Connection是Strategy父类定义需要实现behaviors(在C#里面是method和property)ConnectionManager是Context负责管理各个具体connection在connection里面使用了简单工厂和Reflectionconnection通过配置文件来生成当新增新连接技术时只需要增加Connection子类实现他behaviors修改简单工厂配置文件就可以了这样client根本不需要知道新连接技术原先功能(数据提交)可以使用新连接技术而不需要任何修改

  有关工厂模式和Reflection我打算在下篇进行论述



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: