设计模式之一【策略模式】

55 阅读1分钟

策略模式

 

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

 

 

  • 策略模式是什么?
  • 策略模式可以用来干什么?

 

我们再来看看策略模式可以用来定义一组规则,一组算法,甚至其他的一些规则!

我们来实现2个数字的算法,无非就是加减乘除四种;

先来定义一个结果算法接口

public interface ParamResult {

      double getResult(double d1, double d2);

}

然后定义四种算法

Subtraction.java

public class Subtraction implements    ParamResult {

    @Override
    public double getResult(double d1 ,double d2){

        double result = d1 - d2 ;
        return result;
    }
}

Multi.java

public class Multi implements    ParamResult {


    @Override
    public double getResult(double d1 ,double d2){

        double result = d1 * d2 ;
        return result;
    }
}

Division.java

public class Division implements     ParamResult {

    @Override
    public double getResult(double d1 ,double d2){


        if (d2 == 0)

            try {
                throw  new Exception(" is not  0 ");
            } catch (Exception e) {
                e.printStackTrace();

            }

        double result = d1 / d2 ;

        return result;
    }
}

Add.java

public class Add implements    ParamResult {


    @Override
    public double getResult(double d1 ,double d2){

        double result = d1 + d2 ;
        return result;
    }
}

实现规则

public class ContextResult {

    //不同的运算算法
    private ParamResult paramResult;

    public ContextResult(ParamResult paramResult , Param param){}

    public void getResult(double d1 , double d2){
        paramResult.getResult(d1, d2);
    }
}

 

使用不同的行为策略,进行不同的运算

public static void main(String args[]){


    System.out.println("请输入第一个数:");
    Scanner in = new Scanner(System.in);
    double d1 = in.nextDouble();


    System.out.println("请输入第二个数:");
    double d2 = in.nextDouble();


    ParamResult p1 = new Add();
    ParamResult p2 = new Multi();
    ParamResult p3 = new Subtraction();
    ParamResult p4 = new Division();


    ContextResult c1 = new ContextResult(p1);
    System.out.println(c1.getResult(d1, d2));

    ContextResult c2 = new ContextResult(p2);
    System.out.println(c2.getResult(d1, d2));

    ContextResult c3 = new ContextResult(p3);
    System.out.println(c3.getResult(d1, d2));

    ContextResult c4 = new ContextResult(p4);
    System.out.println(c4.getResult(d1, d2));
}

 

 

结果如下: