.NET 下运用策略模式(组合行为和实体的一种模式)

 更新时间:2012年12月30日 12:39:05   作者:  
我简单的理解策略模式就是把行为(方法)单独的抽象出来,并采用组合(Has-a)的方式,来组合行为和实体的一种模式比如,.NET中对数组排序的Sort的方法就是一个策略模式的实现模板
我简单的理解策略模式就是把行为(方法)单独的抽象出来,并采用组合(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");
}
}
}

相关文章

  • ASP.NET通过byte正确安全的判断上传文件格式

    ASP.NET通过byte正确安全的判断上传文件格式

    本文介绍一种更安全的方式上传图片,他能有效的防止一些通过修改文件后缀或MIME来伪造的图片的上传,从而保证服务器的安全,希望对大家有所帮助。
    2016-03-03
  • 谈谈对.NET中async/await的理解

    谈谈对.NET中async/await的理解

    本文介绍了.NET中异步编程的概念,包括async和await关键字的使用,以及异步编程的性能提升机制,异步编程通过非阻塞操作提高了程序执行效率,减少了主线程的等待时间,感兴趣的朋友一起看看吧
    2025-03-03
  • asp.net CheckBoxList各项最小宽度CSS样式(兼容性good)

    asp.net CheckBoxList各项最小宽度CSS样式(兼容性good)

    ASP.NET中,CheckBoxList里的选择都是自动宽度的,属性时没有设置各项宽度的设置,在IE10、遨游4极速模式及兼容模式下均可正确显示最小宽度,此样式除了用于CheckBoxList外,也可用于DIV等
    2013-04-04
  • spring mvc整合freemarker基于注解方式

    spring mvc整合freemarker基于注解方式

    spring mvc整合freemarker基于注解方式,需要的朋友可以参考一下
    2013-02-02
  • 基于.NET的FluentValidation数据验证实现

    基于.NET的FluentValidation数据验证实现

    这篇文章主要介绍了基于.NET的FluentValidation数据验证实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • jQuery+Asp.Net实现省市二级联动功能的方法

    jQuery+Asp.Net实现省市二级联动功能的方法

    这篇文章主要介绍了jQuery+Asp.Net实现省市二级联动功能的方法,涉及asp.net数据库读取与字符串转换相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • asp.net 简单验证码验证实现代码

    asp.net 简单验证码验证实现代码

    网站开发一般登录注册的时候都要用到了 所以写下来给大家参考参考
    2009-09-09
  • asp.net mvc 动态编译生成Controller的方法

    asp.net mvc 动态编译生成Controller的方法

    本篇文章主要介绍了asp.net mvc 动态编译生成Controller的方法,具有一定的参考价值,有兴趣的可以了解一下
    2017-08-08
  • .Net Core静态文件资源的使用

    .Net Core静态文件资源的使用

    这篇文章介绍了.Net Core静态文件资源的使用方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • ASP.NET输入文本框自动提示功能

    ASP.NET输入文本框自动提示功能

    这篇文章主要介绍了ASP.NET输入文本框自动提示功能的相关资料,当选择某条数据的时候,自动给文本框赋值,减少了人工的输入,需要的朋友可以参考下
    2016-01-01

最新评论