zoukankan      html  css  js  c++  java
  • 设计模式(四) 策略模式


    layout: post
    title: 设计模式(四) 策略模式
    tags:

    • Design_Patterns
      categories:
    • Design_Patterns
      description: 我们从小学习算术 从小学的加减乘除 到后来的方程 三角函数 几何 再到数论 代数 微积分.......我们学的这些东西是我们解决数学问题的.....

    设计模式(四) 策略模式

    我的理解

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

    策略模式

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

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

    graph RL; abstract((TwoNumber<br/> math))-->shop[TwoObject<br/> 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<br/> mathmethod)-.-shop{Math 接口<br/> mathmethod}; abstract2((jian<br/> mathmethod))-.-shop{Math 接口<br/> mathmethod}; abstract3((cheng<br/> mathmethod))-.-shop{Math 接口<br/> mathmethod}; abstract4((chu<br/> mathmethod))-.-shop{Math 接口<br/> 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();
      }
    }
    
  • 相关阅读:
    Bootstrip的相关介绍
    Django的ORM主外键约束实现
    Django基于ORM数据库配置
    Django的安装与配置
    ORM(关系对象映射)框架之面向对象
    pymysql模块的数据操作
    SQL语句实践
    mysql 数据库的基本操作语法
    算法训练 矩阵乘法
    算法训练 字串统计
  • 原文地址:https://www.cnblogs.com/Tamako/p/10859730.html
Copyright © 2011-2022 走看看