【大道模式】策略模式-Strategy Pattern

     当你的代码中出现大量的if else的时候,是时候考虑一下策略模式了。

基本介绍:

1)策略模式中,定义算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

2)这算法体现了几个设计原则:

第一、把变化的代码从不变的代码中分离出来;

第二、针对接口编程而不是具体类(定义了策略接口);

第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)

动机(Motivation):

>在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到兑现各种中,将会使得对象变得异常复杂,有时候支持不使用的算法也是一种性能负担(大量的ifelse判断)。

>在运行时根据需要透明地更改对象的算法,将算法与对象本身解耦,从而避免上述问题。

核心组件

+Strategy:策略接口;

+Context:封装策略接口的类;

+***Strategy:策略实现类;

下面假设一种场景,即我们在每个国家都买东西的时候都需要缴税,而每个多家的税率都是不一样的,如果按照传统的方式我们可以会这么做:

定义TaxEnum枚举类:

public enum TaxEnum {

    CN_TAX,
    JP_TAX,
    US_TAX
}

定义TaxPrice类:

public class TaxPrice {

    public double calTax(double basePrice, TaxEnum taxEnum) {

        if (taxEnum == TaxEnum.CN_TAX) {
            //do sth
            return basePrice * 0.9;
        } else if (taxEnum == TaxEnum.JP_TAX) {
            //do sth
            return basePrice * 0.8;
        } else if (taxEnum == TaxEnum.US_TAX) {
            //do sth
            return basePrice * 0.7;
        }
        //未来如果需要支持法国,德国怎么办?在enum中天健枚举类型,然后再在代码中添加if else。
        //这么做违反了原则:开闭原则,对扩展开放,对修改关闭。
      
        return basePrice;
    }
}

Client:

public class Client {

    public static void main(String[] args) {
        TaxPrice payOrder = new TaxPrice();
        System.out.println(payOrder.calTax(100, TaxEnum.US_TAX));
        System.out.println(payOrder.calTax(100, TaxEnum.CN_TAX));
        System.out.println(payOrder.calTax(100, TaxEnum.JP_TAX));
    }
}

那么问题来了,未来如果需要支持法国,德国怎么办?在enum中天健枚举类型,然后再在代码中添加if else。 //这么做违反了原则:开闭原则,对扩展开放,对修改关闭。因此我们可以使用策略模式来进行重构。

定义TaxStrategy接口:

public interface TaxStrategy {

    double calTax(double basePrice);
}

创建具体策略实现类:

public class CNTaxStrategy implements TaxStrategy {

    public double calTax(double basePrice) {
        return basePrice * 0.9;
    }
}
public class JPTaxStrategy implements TaxStrategy {

    public double calTax(double basePrice) {
        return basePrice * 0.8;
    }
}
public class USTaxStrategy implements TaxStrategy {
    public double calTax(double basePrice) {
        return basePrice * 0.7;
    }
}

创建Client客户端:

public class Client {

    public static void main(String[] args) {
        TaxContext context = new TaxContext(new CNTaxStrategy());
        System.out.println(context.executeStrategy(100));
        context = new TaxContext(new JPTaxStrategy());
        System.out.println(context.executeStrategy(100));
        context = new TaxContext(new USTaxStrategy());
        System.out.println(context.executeStrategy(100));
    }
}

运行结果:

90.0
80.0
70.0

 

Author:忆之独秀

Email:[email protected]

注明出处:https://lavorange.blog.csdn.net/article/details/106459605

你可能感兴趣的:(Java,DesignPattern)