《大话设计模式》——策略模式

策略模式:这是一种对象行为型的模式。实现某一个功能,有多种算法或策略,我们可以根据环境或条件的不同选择不同的算法或策略来完成该功能。

结构组成:

1、算法使用环境角色:在此根据环境或条件选择使用哪一种具体的算法或策略。

2、抽象策略角色:对具体策略角色的抽象。

3、具体策略角色:可供选择的最终的算法或策略。

使用建议:

1、系统需要在几种算法中快速切换。

2、系统中有一些类仅行为不同时,可以考虑策略模式重构。

3、系统中存在多重条件选择时,可以考虑策略模式重构。

例子:一个收营台的费用计算。我们可能会存在几种不同的算法:正常时候的算法、促销时折扣算法,活动时满减算法。

1、首先定义一个抽象策略角色:结算行为。传入结算总额,返回实际总额。

public interface Settlement {
    
    double getResult(double total);
}

2、具体策略角色。

//正常算法
public class Normal implements Settlement {

    public Normal() {}
    
    @Override
    public double getResult(double total) {
        return total;
    }

}
//折扣算法
public class Discount implements Settlement {

    private double rate;
    
    public Discount(double rate) {
        this.rate = rate;
    }
    
    @Override
    public double getResult(double total) {
        return total * rate;
    }

}
//满减算法
public class Reback implements Settlement {

    private double number1;
    private double number2;
    
    public Reback(double number1, double number2) {
        this.number1 = number1;
        this.number2 = number2;
    }
    
    @Override
    public double getResult(double total) {
        total = total - Math.floor((total / number2)) * number1;
        return total;
    }

}

3、使用环境配置。

public class Context {

    private Settlement settlement;
    
    public Context(Settlement settlement) {
        this.settlement = settlement;
    }
    
    public void setSettlement(Settlement settlement) {
        this.settlement = settlement;
    }
    
    public Settlement getSettlement() {
        return settlement;
    }

    public double getResult(double total){
      return settlement.getResult(total);
    }

}

4、客户端使用代码。

public class Main {

    public Main() {
        //正常消费
        Context c = new Context(new Normal());
        c.getResult(1000);
        
        //八折优惠
        c.setSettlement(new Discount(0.8));
        c.getResult(1000);
        
        //满300减100
        c.setSettlement(new Reback(300, 100));
        c.getResult(1000);
    }
}
原文地址:https://www.cnblogs.com/yxth/p/7160997.html