• 策略模式~


    策略模式和简单工厂模式的代码实现非常类似,以至于我很久以来都分不清这两个模式的区别到底在哪,使用场景又有什么区别,因为从实现来讲,简单工厂模式能实现的功能,策略模式都可以实现,事实也是如此。但是简单工厂模式更侧重与创建对象,而策略模式更侧重与对策略的封装 。就是说,这两种模式的区别在于,我们可以通过工厂模式来获取我们想要的对象,既然获取到了对象,我们可以对这个对象做一切可能的操作,比如获取成员变量、作为参数传给其它方法等,但是策略模式,无法获得对象,也就是说我们只能调用策略类给你提供的策略方法。

    依旧使用计算器的那个例子,操作符基类和实现都和简单工厂模式一样,我们具体看策略类的实现

    public class Context{
    	private Operator op;
    	public Context(Operator op)
    	{
    		this.op = op;
    	}
    
    	public double calculate(double num1, double num2)
    	{
    		return op.calculate(num1, num2);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    可以看到我们定义的策略类,持有了操作符对象,在调用计算方法的时候调用初始化时传入的操作符的计算方法,达到我们想要的分离运算逻辑的办法,且客户端只需要反复调用 context 对象的 calculate 方法即可。

    客户端的使用:

    static void Main(String[] args)
    {
    	//
    	//省略读取输入的部分
    	//
    	//加法
    	Context con = new Context(new OperationAdd());
    	Console.WriteLine(con.calculate(num1, num2));
    
    	//减法
    	con = new Context(new OperationSub());
    	Console.WriteLine(con.calculate(num1, num2));
    	
    	//乘法
    	con = new Context(new OperationMul());
    	Console.WriteLine(con.calculate(num1, num2));
    	//……
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    可以看到客户端可以通过创建不同的Context类完成不同的计算需求,且只能完成计算需求,无法获取运算符对象去进行其它操作,这就是策略模式和简单模式区别的根本。同样,我们也可以对策略进行修改,而不仅仅是调用运算符对象的计算方法。比如我们可以在调用计算方法后,将计算方法的结果进行加密操作,返回密文,这就又是一种新的策略,而客户端只需要调用我们提供的接口即可。

    扩展部分

    我们可以写一个工具,这个工具用于对某种对象进行排版,排版样式为表格样式,可以排列成N行M列的表格形式,这时我们只需要创建工具策略类 Tool ,保证传入的对象类型都继承自 基类 ToolItem,然后定义SetData接口(总SetData 方法调用每个 Item 的SetData方法)对每个Item的数据进行赋值,最后通过 Tool类的 Show 方法逐个调用每个 Item 的 Show 方法,并且设置每个 Item 的位置。

  • 相关阅读:
    微服务高可用容灾架构设计
    [附源码]Python计算机毕业设计Django网上鲜花购物系统
    【AI开发:音频】二、GPT-SoVITS使用方法和过程中出现的问题(GPU版)
    使用Jenkins执行TestNg+Selenium+Jsoup自动化测试和生成ExtentReport测试报告
    [附源码]Python计算机毕业设计Django酒店客房管理系统
    MySQL在线升级方案
    QPS\TPS指的是什么?怎样测试一个接口得QPS
    Linux学习之认识操作系统
    你不知道的JavaScript-对象篇
    【DC-DC】AP9180 内置 MOS 管升压型恒流驱动芯片
  • 原文地址:https://blog.csdn.net/aidwao/article/details/134295401