我的实用设计模式之 关于Policy-based design在Windows Mobile网络连接管理的应用

简介:

以下文章为Policy-based design的想法,不是经典的Strategy模式。

 

本文主要讲述Strategy模式在Windows Mobile网络连接管理的应用。经过我的实用设计模式之二--关于Policy-based design的讨论,对Strategy模式进一步思考,有了一些新的认识,Strategy模式使用最为广泛的情景是封装不同的算法,使得客户端不关心具体算法的处理,因此我使用stragety模式最多的是在 Analysis Engine(分析引擎),根据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 data
        
        StopConnection();
        
    }
    
    
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
    }

    
// strategy
     public   interface  Connection
    {
        
// behaviors
         bool  Connect();
        
bool  Disconnect();
        
bool  IsConnected { get ;}
    }

    
public   class  WifiConnection : Connection
    {
        
public   bool  Connect()
        {
            
// invoke wifi api to make connection
             return   true ;
        }
        
public   bool  Disconnect()
        {
            
// invoke wifi api to stop connection
             return   true ;
        }

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

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

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

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

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

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

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

        
public   bool  CheckConnection()
        {
            
// according to specific requirement, pick up one of connections to connect
            currentConnection  =  connections[ConnectionType.Wifi];
            
return  currentConnection.Connect();
        }

        
public   bool  MakeConnection()
        {
            
return  currentConnection.Disconnect();

        }

        
public   bool  StopConnection()
        {
            
return  currentConnection.IsConnected;
        }
    }

    
// connection factory
     public   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 ;
        }
    }

    
// client
     public   class  DataSubmitter
    {
        
public  ConnectionManager connectionMgr;
        
public   void  SubmitData()
        {
            
if ( ! connectionMgr.CheckConnection())
            {
                connectionMgr.MakeConnection();
            }
            
            
// submit data
            
            connectionMgr.StopConnection();
        }
    }
复制代码

 

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

关于工厂模式和Reflection,我打算在下一篇进行论述。


    本文转自Jake Lin博客园博客,原文链接:http://www.cnblogs.com/procoder/archive/2009/03/25/1421038.html,如需转载请自行联系原作者




相关文章
|
2月前
|
机器学习/深度学习 PyTorch TensorFlow
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic,深度学习探索者。深耕TensorFlow与PyTorch,分享框架对比、性能优化与实战经验,助力技术进阶。
|
4月前
|
监控 安全 Shell
管道符在渗透测试与网络安全中的全面应用指南
管道符是渗透测试与网络安全中的关键工具,既可用于高效系统管理,也可能被攻击者利用实施命令注入、权限提升、数据外泄等攻击。本文全面解析管道符的基础原理、实战应用与防御策略,涵盖Windows与Linux系统差异、攻击技术示例及检测手段,帮助安全人员掌握其利用方式与防护措施,提升系统安全性。
194 6
|
8月前
|
SQL 分布式计算 Serverless
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
鹰角网络为应对游戏业务高频活动带来的数据潮汐、资源弹性及稳定性需求,采用阿里云 EMR Serverless Spark 替代原有架构。迁移后实现研发效率提升,支持业务快速发展、计算效率提升,增强SLA保障,稳定性提升,降低运维成本,并支撑全球化数据架构部署。
779 56
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
|
7月前
|
人工智能 监控 安全
NTP网络子钟的技术架构与行业应用解析
在数字化与智能化时代,时间同步精度至关重要。西安同步电子科技有限公司专注时间频率领域,以“同步天下”品牌提供可靠解决方案。其明星产品SYN6109型NTP网络子钟基于网络时间协议,实现高精度时间同步,广泛应用于考场、医院、智慧场景等领域。公司坚持技术创新,产品通过权威认证,未来将结合5G、物联网等技术推动行业进步,引领精准时间管理新时代。
|
3月前
|
机器学习/深度学习 人工智能 算法
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic带你深入卷积神经网络(CNN)核心技术,从生物启发到数学原理,详解ResNet、注意力机制与模型优化,探索视觉智能的演进之路。
399 11
|
3月前
|
安全 Linux 网络安全
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
102 0
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
|
8月前
|
存储 SQL 运维
中国联通网络资源湖仓一体应用实践
本文分享了中国联通技术专家李晓昱在Flink Forward Asia 2024上的演讲,介绍如何借助Flink+Paimon湖仓一体架构解决传统数仓处理百亿级数据的瓶颈。内容涵盖网络资源中心概况、现有挑战、新架构设计及实施效果。新方案实现了数据一致性100%,同步延迟从3小时降至3分钟,存储成本降低50%,为通信行业提供了高效的数据管理范例。未来将深化流式数仓与智能运维融合,推动数字化升级。
340 0
中国联通网络资源湖仓一体应用实践
|
4月前
|
数据采集 存储 数据可视化
Python网络爬虫在环境保护中的应用:污染源监测数据抓取与分析
在环保领域,数据是决策基础,但分散在多个平台,获取困难。Python网络爬虫技术灵活高效,可自动化抓取空气质量、水质、污染源等数据,实现多平台整合、实时更新、结构化存储与异常预警。本文详解爬虫实战应用,涵盖技术选型、代码实现、反爬策略与数据分析,助力环保数据高效利用。
254 0
|
4月前
|
安全 Linux
利用Libevent在CentOS 7上打造异步网络应用
总结以上步骤,您可以在CentOS 7系统上,使用Libevent有效地构建和运行异步网络应用。通过采取正确的架构和代码设计策略,能保证网络应用的高效性和稳定性。
135 0
|
6月前
|
监控 安全 网络协议
恶意软件无处逃!国内版“Manus”AiPy开发Windows沙箱工具,进程行为+网络传输层级监控! 头像 豪气的
NImplant.exe 是一款后渗透测试工具,可实现远程管理与持久化控制。其优点包括无文件技术、加密通信和插件扩展,但也存在被检测风险及配置复杂等问题。为深入分析其行为,我们基于 aipy 开发了 Windows 沙箱工具,针对桌面上的 NImplant.exe 进行多维度分析,涵盖进程行为、网络连接(如 TCP 请求、目标 IP/域名)、文件控制等,并生成传输层监控报告与沙箱截图。结果显示,aipy 工具响应迅速,报告清晰易读,满足分析需求。

热门文章

最新文章