图解设计模式(11) 策略模式

一、 应用场景

    商场对于不同的客户采用不同的打折策略;

图解设计模式(11) 策略模式

    施工对于不同的地形地貌采用不同的施工方法;数据处理针对不同批量的数据选取不同的算法等。

    对于常用的

    if() {

    }else if(){

    }else if(){

    }else{}

    结构,可以采用策略模式来重构。 当增加新的模式时,不需要修改原有的代码,符合开闭原则。

    它可以算法与架构分离。

 

二、具体实现

  •     实现要点

1. 一个Strategy interface, 在其中定义要实现的方法。

2. 多个具体的Strategy类,implements interface, 在其中实现不同的算法。

3.一个上下文类 Context, 其中包含Strategy 对象,可以选择不同的具体策略类来处理业务。

  •     代码实现

以超市打折策略为例,新客户买的少不打折;新客户买的多打9折;老客户买的少打9折;老客户买的多打8折。

 1. Strategy接口,规定要实现的方法。

public interface Strategy {
    double getPrice(double originalPrice);
}

2. 不同的策略, implements interface

public class NewCustomerFew implements Strategy {

    @Override
    public double getPrice(double originalPrice) {
        System.out.println("新客户买的少不打折!");
        return originalPrice;
    }
}

class NewCustomerMany implements Strategy {

    @Override
    public double getPrice(double originalPrice) {
        System.out.println("新客户买的多打九折!");
        return originalPrice * 0.9;
    }
}

class OldCustomerFew implements Strategy {

    @Override
    public double getPrice(double originalPrice) {
        System.out.println("老客户买的少打九折!");
        return originalPrice * 0.9;
    }
}

class OldCustomerMany implements Strategy {

    @Override
    public double getPrice(double originalPrice) {
        System.out.println("老客户买的多打八折!");
        return originalPrice * 0.8;
    }
}

3. 上下文类,包含有策略的对象。

public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
    
    public double getPrice(double originalPrice){
        return this.strategy.getPrice(originalPrice);
    }
}

测试类

public class ClientTest {

    public static void main(String[] args) {
        Context context = new Context(new NewCustomerFew()); //新客户买的少
        System.out.println(context.getPrice(100));
        
        context.setStrategy(new OldCustomerMany());  //老客户买的多
        System.out.println(context.getPrice(999));
    }
}

测试结果

图解设计模式(11) 策略模式

上一篇:MyBatis-Plus代码生成器


下一篇:设计模式之-策略模式