在软件开发过程中有这样一种场景.假设,我们公司的业务人员去实勘房源(检测用户发布的房子是否师真的),如果一个月实勘了十套以上,五十套一下的N套房源则奖励该业务员(1*N + 10)个积分,十套一下奖励(1*N)个积分。五十套以上奖励(1*N+25)个积分。这些积分可都是钱啊!这些算法规则都是暂时也许下一个版本就变了,这都是需求的锅。
一种场景对应一种解决方式。策略模式,他定义了算法族,分别封装起来,让他们之间可以唔想替换,此模式让算法的变化,不会影响到算法客户(大话设计模式)。
public interface Ialgorithm {
//算法内容
int algorithmAction();
}
/**
* 算法管理类
* Created by dushiguang on 16/9/19.
*/
public class AlgorithmContext {
Ialgorithm mIalgorithm;
public AlgorithmContext(Ialgorithm mIalgorithm) {
this.mIalgorithm = mIalgorithm;
}
public int ContextInterface() {
return mIalgorithm.algorithmAction();
}
}
/**
* 实勘数小于10的算法
*/
public class AlgorithmLose10 implements Ialgorithm {
private int num;
public AlgorithmLose10(int num) {
this.num = num;
}
@Override
public int algorithmAction() {
System.out.print("小于10的算法");
return num;
}
}
/**
* 实勘数小于10大于50的算法
*/
public class AlgorithmMore10 implements Ialgorithm {
private int num;
public AlgorithmMore10(int num) {
this.num = num;
}
@Override
public int algorithmAction() {
System.out.print("大于10小于50的算法");
num = num + 10;
return num;
}
}
**
* 实勘数大于50的算法
*/
public class AlgorithmMore50 implements Ialgorithm {
private int num;
public AlgorithmMore50(int num) {
this.num = num;
}
@Override
public int algorithmAction() {
System.out.print("大于50的算法");
num = num + 25;
return num;
}
}
/**
* 使用者类
*/
public class MainAction {
private AlgorithmContext mAlgorithmContext;
private int num;
/**
*
* @param tag 根据参数选择相应的算法
*/
private void acticon(int tag) {
if(tag < 10 && tag > 0) {
mAlgorithmContext = new AlgorithmContext(new AlgorithmLose10(tag));
num = mAlgorithmContext.ContextInterface();
} else if (tag > 10 && tag < 50) {
mAlgorithmContext = new AlgorithmContext(new AlgorithmMore10(tag));
num = mAlgorithmContext.ContextInterface();
} else if(tag > 50) {
mAlgorithmContext = new AlgorithmContext(new AlgorithmMore50(tag));
num = mAlgorithmContext.ContextInterface();
}
System.out.print("---" + num);
}
}
这样可扩展性(OPC)就大大增加了,增加相应的算法类,修改选择添加即可。另外,策略模式和工厂模式结合起来可以更加降低耦合性。
PS:对于设计模式我只是作为学习笔记来写的,并非网上大牛们的手笔,所以各位看官看看就行,有错误请多多指正,要真正学习设计模式,书籍有,《大话设计模式》,这个需要C++语言底子,《您的设计模式》这个讲解的很有风趣,没有《大话设计模式》讲解的深,还有一本《Head First 设计模式》也讲解的蛮有意思的。