设计模式(四) 策略模式
设计模式(四) 策略模式
我的理解
我们从小学习算术 从小学的加减乘除 到后来的方程 三角函数 几何 再到数论 代数 微积分…….我们学的这些东西是我们解决数学问题的工具 所以我们到现在 已近学会并拥有了这些数学工具 我们大脑里面装着一个数学工具箱! ! !这大概就是我对策略模式的一些理解吧 ! 针对不同的数学问题我们可以使用不同的工具
策略模式
策略模式 定义了算法族 分别封装起来 让他们之间可以互相替换 ,次模式让算法的变化独立于使用算法的客户
我们现在来模拟下我们大脑中的数学工具箱 两个数的关系来源于两个对象的关系
graph RL;
abstract((TwoNumber
math))-->shop[TwoObject
relational];
math))-->shop[TwoObject
relational];
class TwoNumber extends TwoObject{
double math(String symbol, double a,double b){
double result = 0
if(symbol.equals("+")){
result=a+b;
}else if(symbol.equals("-")){
result=a-b;
}else if(symbol.equals("*")){
result=a*b;
}else if(symbol.equals("/")){
result=a/b;
}
return result;
}
}
这样的方式或者抽离成多个方法最直观 但是违反开闭原则 扩展其他算法需要修改代码
而且两个对象存在多种关系 数学运算只是其中的一种关系而已 对于数学运算你只能操作子类的math方法
为了结局开闭原则我们可以使用策略模式了 定义算法族 分别封装起来
graph RL;
abstract1(jia
mathmethod)-.-shop{Math 接口
mathmethod}; abstract2((jian
mathmethod))-.-shop{Math 接口
mathmethod}; abstract3((cheng
mathmethod))-.-shop{Math 接口
mathmethod}; abstract4((chu
mathmethod))-.-shop{Math 接口
mathmethod};
mathmethod)-.-shop{Math 接口
mathmethod}; abstract2((jian
mathmethod))-.-shop{Math 接口
mathmethod}; abstract3((cheng
mathmethod))-.-shop{Math 接口
mathmethod}; abstract4((chu
mathmethod))-.-shop{Math 接口
mathmethod};
完善代码 而且假设所有对象都有数学关系 (比如一箱20装的苹果对象a 和一个苹果对象b 和一共有多少个苹果?)
//算法族
class jia implements Math{
@override
public double mathmethod(double a,double b){
return a+b;
}
}
class jian implements Math{
@override
public double mathmethod(double a,double b){
return a-b;
}
}
class cheng implements Math{
@override
public double mathmethod(double a,double b){
return a*b;
}
}
class chu implements Math{
@override
public double mathmethod(double a,double b){
return a/b;
}
}
......
//算法接口
interface Math{
public double mathmethod(double a,double b){};
}
如果对象存在其他关系 在父类中添加关系接口
//父类
class TwoObject{
protected Math math;
//提供修改Math的方法
public void setMath(Math math){
this.math=math;
}
public void printMathmethod(){}
}
//子类
class TwoNumber extends TwoObject{
Double a;
Double b;
TwoNumber(Math math,double a,double b){
this.math=math;
this.a=a;
this.b=b;
}
public void printMathmethod(){
System.out.print(this.math.mathmethod(a,b));
}
}
对于TwoObject和TwoNumber 我们都是针对Math编程 这也是设计模式准则的一种 针对接口编程,而不是针对实现编程
测试类实现以下
class test{
public static void main(String[] args){
TwoObject twoObject = new TwoNumber(new jia(),5.0,0.2);
twoObject.printMathmethod();
}
}