设计模式 之 策略模式

定义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式,让算法的变化,不会影响到使用算法的客户。

策略模式是一种定义一系列算法的方法,从概念上来看,所有的算法都是完成相同的工作,知识实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

策略模式的Strategy类层为Context定义了一系列的可供重用的算法或行为。继承有助于读取出这些算法中的公共功能。

策略模式的优点:简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

策略模式还可以用来处理变化的可能性,此处“变化”是指不同场景应用不同业务规则。

策略模式封装了变化。

 

策略与简单工厂结合:

package o2Strategy;
/**
 * Strategy类 运算类 基类
 * 属性 a、b 以及getResult方法
 */
public class OperationStrategy {

	public Object getResult(double a, double b) {
		return null;
	}
	
}
package o2Strategy;
/**
 * 子类 加法类
 * getResult 具体功能实现
 */
public class Add extends OperationStrategy {

	@Override
	public Object getResult(double a, double b) {
		return a + b;
	}
}
package o2Strategy;
/**
 * 子类 除法类
 * getResult 具体功能实现
 */
public class Div extends OperationStrategy {

	@Override
	public Object getResult(double a, double b) {
		return a / b;
	}
}
package o2Strategy;
/**
 * 工厂类 创造具体运算类
 */
public class OperateContext {
	
	OperationStrategy os = null;
	
	public OperateContext(String opr) {
		switch (opr) {
		case "+":
			os = new Add();
			break;
		case "/":
			os = new Div();
			break;
		}
	}
	public Object getResult(double a, double b) {
		return os.getResult(a,b);
	}

}
package o2Strategy;

/**
 * 调用者 界面
 * 只关注结果,不关注具体实现
 */
public class Test {

	public static void main(String[] args) {
		// 确认算法
		OperateContext os = new OperateContext("+");
		// 输入参数,得出结果
		System.out.println(os.getResult(17.64d,5d));
	}
}

简单工厂与策略比较:

简单工厂

public static void main(String[] args) {
        Operation op = OperateFactory.getOperation("+");
        op.setA(4);
        op.setB(6);
        System.out.println(op.getResult());//也可以通过方法参数传值
    }

策略

public static void main(String[] args) {
        // 确认算法
        OperateContext os = new OperateContext("+");
        // 输入参数,得出结果
        System.out.println(os.getResult(17.64d,5d));
    }

可以看出,策略模式把算法父类都隐藏起来了,客户端只需要认识一个OperateContext就可以了,耦合度降低了。

如果要新增一个算法Sub,那么还是要修改OperateContext的switch代码,这是需求变更中不可避免的成本。但是成本是有高低差异的。同样的需求,改动越少越好,方法就是利用反射(抽象工厂模式中也有讲到)。常言道:反射反射,程序员的快乐。(此处引用另一博主的文章)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值