博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET 下运用策略模式
阅读量:5135 次
发布时间:2019-06-13

本文共 2463 字,大约阅读时间需要 8 分钟。

我简单的理解策略模式就是把行为(方法)单独的抽象出来,并采用组合(Has-a)的方式,来组合行为和实体的一种模式。再来个官方的解释:

Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

 

网上也有很多资源介绍这个模式,我也不从头说起了。在.NET中委托给我们给我们提供了简单实现策略模式的方法,可以简单的把一个委托看成是一种策略方法,而且还能借组lmabda表达式这样的形式来表达出来。比如,.NET中对数组排序的Sort的方法就是一个策略模式的实现模板。

static void Main(string[] args){    int[] array = new int[] { 3, 2, 8, 1, 5 };    //相当于是重新设置了一个排序策略    Array.Sort(array, (a, b) => b - a);    //这里也相当于为每个元素安排了一个输出策略    Array.ForEach(array, Console.WriteLine);}

以上Array的两个方法都可以看成是策略模式在.net中的一种实现。

之前写一些UI自动化的时候,也借鉴了一下策略模式的思想。下面是我的一个实例:被测试网站是一个针对全球很多市场的一个网站,有时同一个测试点,需要我们配置一下网络代理和其它不同的设置来模拟当地市场。

 

using System;using System.Linq;namespace StrategyPattern{    class Program    {        static void Main(string[] args)        {            UITest test = new UITest();            test.RunTest();            test.SetProxy("zh-cn");            test.RunTest();        }    }    class UITest    {        Action proxyStrategy;        //Default is US market        public UITest(String market = "en-us")        {            setProxy(market);        }        public void SetProxy(String market)        {            setProxy(market);        }        private void setProxy(String market)        {            Type proxy = typeof(Proxy);            var m = (from i in proxy.GetMethods()                     from j in i.GetCustomAttributes(false)                     let k = j as Market                     where k != null                     && k.MarketName.Contains(market)                     select i).First();            proxyStrategy = (Action)Delegate.CreateDelegate(typeof(Action), null, m);        }        public void RunTest()        {            proxyStrategy();            //之后运行主要的功能测试            //......        }    }    class Market : Attribute    {        public String MarketName { get; set; }        public Market(String marketName)        {            this.MarketName = marketName;        }    }    class Proxy    {        [Market("en-us,es-us")]        public void SetUSProxy()        {            Console.WriteLine("us proxy");        }        [Market("zh-cn")]        public void SetChinaProxy()        {            Console.WriteLine("china proxy");        }        [Market("en-gb")]        public void SetUKProxy()        {            Console.WriteLine("uk proxy");        }    }}

 

 

转载于:https://www.cnblogs.com/heqichang/archive/2012/12/13/2815927.html

你可能感兴趣的文章
linux简介
查看>>
在页面里写个动态本地时间
查看>>
启动另一个app
查看>>
Redis开启远程登录连接
查看>>
当初为蜂巢样式实验过的方法
查看>>
跨域几种解决方法
查看>>
Qt程序继承QApplication发生崩溃的原因
查看>>
ant design样式不生效,在使用了css modules
查看>>
ArcGIS网络分析之Silverlight客户端最近设施点分析(四)
查看>>
NuGet 本地服务器 公司组件库搭建 上传下载操作 模块化灵活设计
查看>>
Kafka Shell基本命令
查看>>
Vue.js——vue-resource全攻略
查看>>
md5.js aop.js ArrayList.js HashMap.js jquery.cookie.js json.js
查看>>
ORACLE SEQUENCE用法
查看>>
ios开发之路十一(ARC forbids explicit message send of 'autorelease'错误)
查看>>
PHP访问MSSQL数据库(实例代码)
查看>>
iOS开发技巧-Swift版本: 1.UITextView不同页面之间的传参
查看>>
常见正则表达式规范石材
查看>>
markdown
查看>>
第一次
查看>>