我的实用设计模式之 关于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,如需转载请自行联系原作者




相关文章
|
14天前
|
负载均衡 容灾 Cloud Native
云原生应用网关进阶:阿里云网络ALB Ingress 全能增强
在过去半年,ALB Ingress Controller推出了多项高级特性,包括支持AScript自定义脚本、慢启动、连接优雅中断等功能,增强了产品的灵活性和用户体验。此外,还推出了ingress2Albconfig工具,方便用户从Nginx Ingress迁移到ALB Ingress,以及通过Webhook服务实现更智能的配置校验,减少错误配置带来的影响。在容灾部署方面,支持了多集群网关,提高了系统的高可用性和容灾能力。这些改进旨在为用户提供更强大、更安全的云原生网关解决方案。
262 13
|
13天前
|
容灾 网络协议 数据库
云卓越架构:云上网络稳定性建设和应用稳定性治理最佳实践
本文介绍了云上网络稳定性体系建设的关键内容,包括面向失败的架构设计、可观测性与应急恢复、客户案例及阿里巴巴的核心电商架构演进。首先强调了网络稳定性的挑战及其应对策略,如责任共担模型和冗余设计。接着详细探讨了多可用区部署、弹性架构规划及跨地域容灾设计的最佳实践,特别是阿里云的产品和技术如何助力实现高可用性和快速故障恢复。最后通过具体案例展示了秒级故障转移的效果,以及同城多活架构下的实际应用。这些措施共同确保了业务在面对网络故障时的持续稳定运行。
|
1月前
|
Kubernetes 安全 Devops
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
69 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
|
16天前
|
数据采集 JavaScript 前端开发
异步请求在TypeScript网络爬虫中的应用
异步请求在TypeScript网络爬虫中的应用
|
2月前
|
存储 监控 物联网
计算机网络的应用
计算机网络已深入现代生活的多个方面,包括通信与交流(电子邮件、即时通讯、社交媒体)、媒体与娱乐(在线媒体、在线游戏)、商务与经济(电子商务、远程办公)、教育与学习(在线教育平台)、物联网与智能家居、远程服务(远程医疗、智能交通系统)及数据存储与处理(云计算、数据共享与分析)。这些应用极大地方便了人们的生活,促进了社会的发展。
68 2
计算机网络的应用
|
2月前
|
机器学习/深度学习 运维 安全
图神经网络在欺诈检测与蛋白质功能预测中的应用概述
金融交易网络与蛋白质结构的共同特点是它们无法通过简单的欧几里得空间模型来准确描述,而是需要复杂的图结构来捕捉实体间的交互模式。传统深度学习方法在处理这类数据时效果不佳,图神经网络(GNNs)因此成为解决此类问题的关键技术。GNNs通过消息传递机制,能有效提取图结构中的深层特征,适用于欺诈检测和蛋白质功能预测等复杂网络建模任务。
94 2
图神经网络在欺诈检测与蛋白质功能预测中的应用概述
|
1月前
|
存储 安全 网络安全
网络安全的盾与剑:漏洞防御与加密技术的实战应用
在数字化浪潮中,网络安全成为保护信息资产的重中之重。本文将深入探讨网络安全的两个关键领域——安全漏洞的防御策略和加密技术的应用,通过具体案例分析常见的安全威胁,并提供实用的防护措施。同时,我们将展示如何利用Python编程语言实现简单的加密算法,增强读者的安全意识和技术能力。文章旨在为非专业读者提供一扇了解网络安全复杂世界的窗口,以及为专业人士提供可立即投入使用的技术参考。
|
2月前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
89 8
|
2月前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
63 2
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习中的卷积神经网络(CNN)及其在现代应用中的革新
探索深度学习中的卷积神经网络(CNN)及其在现代应用中的革新

热门文章

最新文章