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

我简单的理解策略模式就是把行为(方法)单独的抽象出来,并采用组合(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");
}
}
}

(0)

相关推荐

  • java实现策略模式使用示例

    思路如下: 使用interface来定义一个接口,在该接口中定义save()方法:根据图片格式定义不同的类,分别在这些类中使用关键字implements实现接口:创建一个实现选择的类,在该类中定义实现选择的方法,该方法返回值为对应的图片保存类:在主方法中实现接口.代码如下: 复制代码 代码如下: public interface ImageSaver {    void save();//定义save()方法} public class GIFSaver implements ImageSave

  • C#策略模式(Strategy Pattern)实例教程

    本文以一个简单的实例来说明C#策略模式的实现方法,分享给大家供大家参考.具体实现方法如下: 一般来说,当一个动作有多种实现方法,在实际使用时,需要根据不同情况选择某个方法执行动作,就可以考虑使用策略模式. 把动作抽象成接口,比如把玩球抽象成接口.代码如下: public interface IBall { void Play(); } 有可能是玩足球.篮球.排球等,把这些球类抽象成实现接口的类.分别如下: public class Football : IBall { public void P

  • 浅析.net策略模式

    对于策略模式的理解:当一个业务有多种需求时候,在某个时候需要使用不同的方式来计算结果.这时候不同的方式可以理解为不同的策略来解决同样的问题. 例如:商场收银系统计算价格,1:正常计算 2:商品打折计算,3:满300减100等方式.就可以按三种策略来处理需求. 简单的说:策略模式就是用来封装算法的,但在实践中,我们发现可以用他来封装几乎任何类型的规则,只要在分析过程中听到需要在不同的时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性. 复制代码 代码如下: using System

  • 关于.NET Framework中的设计模式--应用策略模式为List排序

    简单类型排序 编程时遇到排序在平常不过,使用.Net最常见的就是对泛型List<T>进行排序,如果T是简单数据类型排序那么很简单 复制代码 代码如下: public List<int> SortSimpleList(List<int> list){list.Sort();return list;} 同样对string等简单类型List<T>排序均如此,如果我们要排的对象复杂了怎么办,我们知道List<T> sort()最后是用快速排序实现,快速排

  • php设计模式 Strategy(策略模式)

    抽象策略(Strategy)角色:定义所有支持的算法的公共接口.通常是以一个接口或抽象来实现.Context使用这个接口来调用其ConcreteStrategy定义的算法. 具体策略(ConcreteStrategy)角色:以Strategy接口实现某具体算法. 环境(Context)角色:持有一个Strategy类的引用,用一个ConcreteStrategy对象来配置 核心代码 <?php interface Strategy { // 抽象策略角色,以接口实现 public functio

  • C++设计模式之策略模式

    前言 刚刚加班回来:哎,公司规定平时加班只有10块钱的餐补:星期六和星期天加班,只给串休假:在国家规定的节假日按照3倍工资发放.那么对于这么多的计算加班费的方法,公司的OA系统是如何进行做的呢?这就要说到今天我这里总结的策略设计模式了. 策略模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.该模式使得算法可独立于使用它的客户而变化. 策略模式为了适应不同的需求,只把变化点封装了,这个变化点就是实现不同

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

    我简单的理解策略模式就是把行为(方法)单独的抽象出来,并采用组合(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. 网上也有很多资源介绍这个模式,我也不从头说起了.在.

  • Spring 环境下实现策略模式的示例

    背景 最近在忙一个需求,大致就是给满足特定条件的用户发营销邮件,但是用户的来源有很多方式:从 ES 查询的.从 csv 导入的.从 MongoDB 查询-.. 需求很简单,但是怎么写的优雅,方便后续扩展,就存在很多门道了. 我们的项目是基于 Spring Boot 开发的,因此这篇文章也会基于 Spring Boot 作为基础框架,教你如何使用 Spring 依赖注入的特性,优雅的实现策略模式. 1. 简单粗暴 最简单粗暴直接的方式莫过于 if...else- 了,伪代码如下: if(来源 ==

  • 详解Linux系统三种模式下的简单命令

    i的编辑器: 1.三种模式:底行模式 命令模式 插入模式 命令模式: 1.从命令切换插入模式: i : 光标所在左侧输入 I 光标移动到所在行的最左则    o :光标移动的下一行(新的一行) O:光标移动的上一行(新的一行)    a :光标移动到所在行的右则输入 A:光标移动到所在行的最右则 2.复制:(n代表数字) 行: nyy n>0 单词:nyw n>0 3.粘贴:p 4.撤消到上一步骤:u 5.恢复到上一步: ctrl+r 6.替换: 替换一个字符:r 连续替换    :R 7.定

  • Linux下的ctrl常用组合键及操作方法

    在linux的命令模式下使用ctrl组合键能让操作更便捷. ctrl + k : 剪切光标及其后边的内容: ctrl + u : 剪切光标之前的内容: ctrl + y : 在光标处粘贴上两个命令,粘贴方式和被剪切方式相同: ctrl + c : 结束正在运行的程序或命令: ctrl + d : 结束当前命令窗口: ctrl + r : 输入关键字可弹出曾经用过的指令: ctrl + l : 清屏:(和clear效果相同) ctrl + a : 光标切换到行开头: ctrl + e : 光标切换

  • Linux下SVN服务器同时支持Apache的http和svnserve独立服务器两种模式且使用相同的访问权限账号

    说明: 服务器操作系统:CentOS 6.x 服务器IP:192.168.21.134 实现目的: 1.在服务器上安装配置SVN服务: 2.配置SVN服务同时支持Apache的http和svnserve独立服务器两种模式访问: 3.Apache的http和svnserve独立服务器两种模式使用相同的访问权限账号. 具体操作: 一.关闭SELINUX vi /etc/selinux/config #SELINUX=enforcing #注释掉 #SELINUXTYPE=targeted #注释掉

  • 浅谈PHP面向对象之访问者模式+组合模式

    因为原文中延续了组合模式的代码示例来讲访问者模式 所以这里就合并一起来复习了.但主要还是讲访问者模式.顾名思义这个模式会有一个访问者类(就像近期的热播剧"人民的名义"中的检查官,跑到到贪官家里调查取证,查实后就定罪),被访问者类调用访问者类的时候会将自身传递给它使用. 直接看代码: //被访问者基类 abstract class Unit { abstract function bombardStrength(); //获取单位的攻击力 //这个方法将调用访问者类,并将自身传递给它 f

  • JavaScript中创建对象的7种模式详解

    ECMA-262把对象定义为:"无需属性的集合,其属性可以包含基本值.对象或者函数."严格来讲,这就相当于说明对象是一组没有特定顺序的值.对象的每个属性或方法都有一个名字,而每个名字都映射到一个值.正因为这样,我们可以把ECMAScript的对象想象成散列表:无非就是一组名对值,其中值可以是数据或函数. 创建自定义对象最简单的方式就是创建一个Object的实例,然后再为他添加属性和方法,如下所示: var person = new Object();.person.name = &qu

  • javascript创建对象的几种模式介绍

    在js中有几种模式可以创建对象,通过对象操作所包含的属性与方法. 一般来说,构造函数名称的第一个字母为大写字母,非构造函数名称的第一个字母为小写字母,当然,构造函数与一般函数唯一的区别只是调用的方式不同而已,所以任何函数只要通过new来调用,那它就可以作为构造函数,若不通过new来调用,则与一般函数一样. 谈谈我对这几种模式的理解: 工厂模式:创建一个一般函数,在函数里创建一个Object对象,为这个对象增添属性与方法,同时赋予其值,最后返回对象.无法识别对象类型. 构造函数模式:创建构造函数,

  • 理解js对象继承的N种模式

    本文分享了js对象继承的N种模式,供大家参考. 一.原型链继承 function Person(){}; Person.prototype = { constructor: Person, name: "Oliver" }; function People(){}; People.prototype = new Person(); People.prototype.constructor = People; People.prototype.sayName = function(){

  • 浅谈vim的四种模式及模式切换

    vim和记事本或WORD不一样,不是一打开后就可以输入文字,此时它处于正常模式. vim一共有4个模式: • 正常模式 (Normal-mode) • 插入模式 (Insert-mode) • 命令模式 (Command-mode) • 可视模式 (Visual-mode) 正常模式 启动vim后默认处于正常模式.不论位于什么模式,按下<Esc>键(有时需要按两下)都会进入正常模式. 插入模式 在正常模式中按下i, I, a, A等键,会进入插入模式.现在只用记住按i键会进行插入模式.在插入模

随机推荐