其他分享
首页 > 其他分享> > 设计模式——策略模式

设计模式——策略模式

作者:互联网

设计模式——策略模式

@author 无忧少年

@createTime 2019/7/16

策略模式: 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户端

策略模式简单的说就是用户在客户端自己选择对应的策略也就是选择算法。

策略模式结构图:

策略模式结构图

将我在简单工厂模式中的计算器的算法用策略模式实现的代码如下:

// 运算类
public interface Operation {
 
    public double getResult(double numberA,double numberB) throws Exception;
 
}
// 加法类
class Add implements Operation{
 
    // 加法计算
    public double getResult(double numberA, double numberB) {
 
        return numberA + numberB;
    }
}
 
 // 减法类
public class Sub implements Operation{
 
    // 减法计算
    public double getResult(double numberA, double numberB) {
        return numberA-numberB;
    }
}

// 乘法类
public class Mul implements Operation{
 
    // 乘法计算
    public double getResult(double numberA, double numberB) {
        return numberA * numberB;
    }
}
 
 // 除法类
public class Div implements Operation {
 
    // 除法计算
    public double getResult(double numberA, double numberB) throws Exception {
        if (numberB == 0) {
            throw new Exception("除数不能为0!");
        }
        return numberA / numberB;
    }
}

// 上下文
public class Context {
    private Operation operation;
    // 根据初始化时传入具体的算法
    public Context(Operation operation){
        this.operation=operation;
    }
    // 上下文接口--根据具体的策略对象,调用其算法的方法。
    public double ContextInterface(double numberA,double numberB){
        return operation.getResult(numberA, numberB);
    }
}

// 客户端代码
public class Client {
 
    public static void main(String[] args) throws Exception {
 		Context context;
        context=new Context(new Add());
        System.out.println(context.ContextInterface(1,1));
        
        context=new Context(new Sub());
        System.out.println(context.ContextInterface(1,1));
        
        context=new Context(new Mul());
        System.out.println(context.ContextInterface(1,1));
        
        context=new Context(new Div());
        System.out.println(context.ContextInterface(1,1));
        
    }
}

// 控制台输出
2.0
0.0
1.0
1.0

​ 这就是策略模式通过客户端,用户需要知道context和具体的算法类,用户自己选择具体算法,输出结果,如果将策略模式和简单工厂模式结合,那客户端的操作将更加简单,耦合度也会降低很多。代码如下:

// 运算类
public interface Operation {
 
    public double getResult(double numberA,double numberB) throws Exception;
 
}
// 加法类
class Add implements Operation{
 
    // 加法计算
    public double getResult(double numberA, double numberB) {
 
        return numberA + numberB;
    }
}
 
 // 减法类
public class Sub implements Operation{
 
    // 减法计算
    public double getResult(double numberA, double numberB) {
        return numberA-numberB;
    }
}

// 乘法类
public class Mul implements Operation{
 
    // 乘法计算
    public double getResult(double numberA, double numberB) {
        return numberA * numberB;
    }
}
 
 // 除法类
public class Div implements Operation {
 
    // 除法计算
    public double getResult(double numberA, double numberB) throws Exception {
        if (numberB == 0) {
            throw new Exception("除数不能为0!");
        }
        return numberA / numberB;
    }
}

// 上下文---和工厂模式结合
public class Context {
    private Operation operation;
    // 根据初始化时传入具体的算法
    public Context(String name){
        switch (name) {
            case "+":
                this.operation = new Add();
                break;
            case "-":
                this.operation = new Sub();
                break;
            case "*":
                this.operation = new Mul();
                break;
            case "/":
                this.operation = new Div();
                break;
        }
    }
    // 上下文接口--根据具体的策略对象,调用其算法的方法。
    public double ContextInterface(double numberA,double numberB){
        return operation.getResult(numberA, numberB);
    }
}

// 客户端代码
public class Client {
 
    public static void main(String[] args) throws Exception {
 		Context context;
        context=new Context("+");
        System.out.println(context.ContextInterface(1,1));
        
        context=new Context("-");
        System.out.println(context.ContextInterface(1,1));
        
        context=new Context("*");
        System.out.println(context.ContextInterface(1,1));
        
        context=new Context("/");
        System.out.println(context.ContextInterface(1,1));
        
    }
}

// 控制台输出
2.0
0.0
1.0
1.0

​ 策略模式和工厂模式结合之后,客户端只需要知道context这一个类即可,降低了客户端的职责,降低的耦合度。

标签:numberB,策略,numberA,double,模式,context,new,设计模式,public
来源: https://blog.csdn.net/qq_45515432/article/details/100062889