Java 设计模式之策略模式

文章目录

  • Java 设计模式之策略模式
    • 特点
    • UML图
    • 传统if-else
    • 策略模式优化

Java 设计模式之策略模式

特点

定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。策略模式模式使得算法可独立于使用它的客户而独立变化。

UML图

Java 设计模式之策略模式_第1张图片

  • Context:上下文环境。
  • Strategy:抽象策略类。
  • ConcreteStrategyA、ConcreteStrategyB:具体策略类。

传统if-else

public class PriceCalculator {
    public static final int TYPE_BUS = 1;
    public static final int TYPE_SUBWAY = 2;

    /**
     * 公交车计价
     */
    private int busPrice(int km) {
        int price = 1;
        //超出10km的距离
        int extraTotal = km - 10;
        int extraParts = extraTotal / 5;
        extraParts = extraTotal % 5 > 0 ? ++extraParts : extraParts;
        price += extraParts * 1;
        return price;
    }


    /**
     * 地铁计价
     */
    private int subwayPrice(int km) {
        if (km <= 6) {
            return 3;
        } else if (km > 6 && km <= 12) {
            return 4;
        } else if (km > 12 && km <= 22) {
            return 5;
        } else if (km > 22 && km <= 32) {
            return 6;
        } else {
            return 7;
        }
    }

    public int calculatorPrice(int type, int km) {
        switch (type) {
            case TYPE_BUS:
                return busPrice(km);
            case TYPE_SUBWAY:
                return subwayPrice(km);
            default:
                return 0;
        }
    }
}

使用:

public class Client {
    public static void main(String[] args) {
        PriceCalculator calculator = new PriceCalculator();
        int cost1 = calculator.calculatorPrice(PriceCalculator.TYPE_SUBWAY, 16);
        System.out.println(cost1);
        int cost2 = calculator.calculatorPrice(PriceCalculator.TYPE_BUS, 16);
        System.out.println(cost2);
    }
}

输出:

5
3

策略模式优化

定义抽象策略类:

interface Strategy {
    int calculatePrice(int km);
}

定义具体策略类:

public class BusStrategy implements Strategy {
    @Override
    public int calculatePrice(int km) {
        int price = 1;
        //超出10km的距离
        int extraTotal = km - 10;
        int extraParts = extraTotal / 5;
        extraParts = extraTotal % 5 > 0 ? ++extraParts : extraParts;
        price += extraParts * 1;
        return price;
    }
}
public class SubwayStrategy implements Strategy {
    @Override
    public int calculatePrice(int km) {
        if (km <= 6) {
            return 3;
        } else if (km > 6 && km <= 12) {
            return 4;
        } else if (km > 12 && km <= 22) {
            return 5;
        } else if (km > 22 && km <= 32) {
            return 6;
        } else {
            return 7;
        }
    }
}

定义上下文环境类:

public class Calculator {
    Strategy strategy = null;

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public int calculatePrice(int km) {
        return strategy.calculatePrice(km);
    }
}

使用:

public class Client {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        calculator.setStrategy(new BusStrategy());
        int cost1 = calculator.calculatePrice(16);
        System.out.println(cost1);
        calculator.setStrategy(new SubwayStrategy());
        int cost2 = calculator.calculatePrice(16);
        System.out.println(cost2);
    }
}

输出:

3
5

你可能感兴趣的:(#,Java,设计模式,策略模式,设计模式)