设计模式:策略模式

策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。策略模式是一种定义一系列算法的方法,从概念来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。

一、引

我们必须要真正理解模式的思路,才能在不同情况下选择合适的模式。我们使用模式的目的就是是代码层次思路清晰,并且尽可能的减少已完成代码需要修改重新编译的情况,进而降低代码被无意或者有意的修改破坏。还有一个是我个人的使用习惯,就是尽量使主程序的代码简洁清晰,从而降低耦合度。

二、问题

我们来思考一下,现在需要一个用于计算交易额的程序,计算交易额的算法有多种,其中包括等价交易、打折交易等方式,而且计算交易额的算法随时都需要添加其他的算法,如添加满消费返现的算法。为了实现功能,并保证程序的低耦合、可维护性、安全性等等,你会如何设计?

三、理解

我们仔细思考一下这个程序的需求,可以将其简化为,输入金额-->选择一种计算算法-->得到交易额,经过分析,其中的思路其实已经非常明显了,我们可以知道虽然有多种计算算法,但是这些算法都是为了得到一个数值,只是实现方式不同而已(理解策略模式的定义),所以我们只需要设计一个抽象的类,然后分别写不同算法的子类继承它,并使用一个实用类使用它即可。(有人会说可以用简单工厂模式,当然可以,只不过我每次添加新的算法的时候,我都需要去修改工厂类中的switch判断,所以每次都需要重新编译工厂类,还是存在风险)

四、实现

我们需要一个抽象父类,一些算法子类,一个实用类

抽象父类代码:

public abstract class Strategy {
	public abstract double AlgorithmInterface(double money);
}

各算法子类

//等价交易
public class NormalCash extends Strategy {

	@Override
	public double AlgorithmInterface(double money) {
		return money;
	}

}

//打折交易
public class RebateCash extends Strategy {
	private double moneyRebate = 1d;
	
	public RebateCash(String moneyRebate) {
		this.moneyRebate = Double.parseDouble(moneyRebate);
	}

	@Override
	public double AlgorithmInterface(double money) {
		return money * moneyRebate;
	}

}

//满消费返现交易
public class ReturnCash extends Strategy {

	private double moneyCondition = 0.0d;
	private double moneyReturn = 0.0d;
	
	public ReturnCash(String moneyCondition, String moneyReturn) {
		this.moneyCondition = Double.parseDouble(moneyCondition);
		this.moneyReturn = Double.parseDouble(moneyReturn);
	}
	
	@Override
	public double AlgorithmInterface(double money) {
		double result = money;
		if(money >= moneyCondition) {
			result = money - Math.floor(money / moneyCondition) * moneyReturn;
			
		}
		return result;
	}

}

实用类:

public class ContextCash {
	private Strategy strategy;
	
	public ContextCash(Strategy strategy) {
		this.strategy = strategy;
	}
	
	public double GetResult(double money) {
		return strategy.AlgorithmInterface(money);
	}
}

最后在主程序中测试使用:

public class Main {

	public static void main(String[] args) {
		double total = 0.0d;
		ContextCash cash = null;
		cash = new ContextCash(new NormalCash());
		System.out.println(cash.GetResult(1.12));
		cash = new ContextCash(new RebateCash("0.8"));
		System.out.println(cash.GetResult(1.12));
		cash = new ContextCash(new ReturnCash("300", "100"));
		System.out.println(cash.GetResult(310));
	}

}

 

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值