最近项目中有些模块有重复的功能代码,原来的单一接口实现不能满足当前业务需求,倒逼设计模式的成型。
过去代码中相似的功能点基本是直接剥离到公共类和工具类当中,但是随着需求的增多,业务代码中多了许多if...else..的判断,这使得项目的耦合性变得很高。我们选择了策略模式作为主要的设计模式来对原有代码进行手术。
策略模式的优点:
各自的类实现各自的方法,它们不属于任何方法或实体;
可以根据需要被选择,类与类之间互不干扰;
策略模式的缺点:
所有策略类需要暴露;
需要的算法越多,策略类就越多
所以我们应该根据情况来判断,最好是多种模式混合使用。
接下来我们以一个小学数学应用题来作为示例:
//甲、乙两人同时从A地出发,以相同的速度向B地前进,甲每行5分钟休息2分钟,
// 乙每行210米休息3分钟,甲出发后50分钟到达B地,乙到达B地比甲迟了10分钟.
// 已知两人最后一次的休息地点相距70米,两人的速度是多少?
1、创建一个数学运算的接口:
public interface Strategy {
double operate(double a, double b);
}
2、创建具体的运算法则来实现这个运算:
public class Plus implements Strategy {
@Override
public double operate(double a, double b) {
return a + b;
}
}
public class Multiply implements Strategy {
@Override
public double operate(double a, double b) {
return a * b;
}
}
public class Division implements Strategy {
@Override
public double operate(double a, double b) {
return a / b;
}
}
3、创建运算过程实体:
public class Operate {
private Strategy strategy;
public Operate(Strategy strategy){
this.strategy = strategy;
}
public double opertion(double a, double b){
return strategy.operate(a, b);
}
}
4、创建人物实体:
public class Person {
private double rest;
private double times;
public double getRest() {
return rest;
}
public void setRest(double rest) {
this.rest = rest;
}
public double getTimes() {
return times;
}
public void setTimes(double times) {
this.times = times;
}
}
5、测试类:
Operate plus = new Operate(new Plus());
Operate substract = new Operate(new Substract());
Operate multiply = new Operate(new Multiply());
Operate division = new Operate(new Division());
Person liLei = new Person();
Person hanMeiMei = new Person();
//计算甲休息的次数
liLei.setTimes(Math.floor(division.opertion(50, plus.opertion(5, 2))));
//计算甲休息的时间
liLei.setRest(multiply.opertion(2, liLei.getTimes()));
//计算乙休息的时间
hanMeiMei.setRest(plus.opertion(liLei.getRest(), 10));
//计算乙休息的次数
hanMeiMei.setTimes(Math.floor(division.opertion(hanMeiMei.getRest(), 3)));
//计算总路程
double length= plus.opertion(multiply.opertion(210, hanMeiMei.getTimes()), 70);
//计算总时间
double time = multiply.opertion(5, liLei.getTimes());
double rate = division.opertion(length, time);
感谢阅读,不足之处还请多多指点:)