设计模式(四) 策略模式

我的理解

我们从小学习算术 从小学的加减乘除 到后来的方程 三角函数 几何 再到数论 代数 微积分…….我们学的这些东西是我们解决数学问题的工具 所以我们到现在 已近学会并拥有了这些数学工具 我们大脑里面装着一个数学工具箱! ! !这大概就是我对策略模式的一些理解吧 ! 针对不同的数学问题我们可以使用不同的工具

策略模式

策略模式 定义了算法族 分别封装起来 让他们之间可以互相替换 ,次模式让算法的变化独立于使用算法的客户

我们现在来模拟下我们大脑中的数学工具箱 两个数的关系来源于两个对象的关系

graph RL; abstract((TwoNumber
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};

完善代码 而且假设所有对象都有数学关系 (比如一箱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();
  }
}