设计模式之策略模式

模式定义

策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
策略模式结构如下:

案例分析

场景:某电商促销线上活动,付款方式有微信支付,支付宝支付等;打折种类有限时折扣,限量折扣等,写程序实现支付方式和折扣的动态扩展和组合。
代码实现如下:
支付策略抽象类

public abstract class PayStrategy {
    public abstract void pay();
}

折扣抽象类

public abstract class DiscountStrategy {
    public abstract void shipping();
}
public class WeiXinPay extends PayStrategy {
    @Override
    public void pay() {
        System.out.println("微信支付。。。。。。");
    }
}
public class AliPay extends PayStrategy {
    @Override
    public void pay() {
        System.out.println("支付宝支付。。。。。。");
    }
}
/**
 * 限时
 */
public class TimeLimitedDiscount extends DiscountStrategy {
    @Override
    public void shipping() {
        System.out.println("享受限时抢购折扣。。。。。。");
    }
}
public class PayContext {

    private PayStrategy payStrategy;
    private DiscountStrategy discountStrategy;

    public PayContext(PayStrategy payStrategy, DiscountStrategy discountStrategy) {
        this.payStrategy = payStrategy;
        this.discountStrategy = discountStrategy;
        System.out.println("准备支付了。。。。。。");
    }

    /**
     * 支付类型和打折
     */
    public void payment(){

        payStrategy.pay();
        discountStrategy.shipping();
    }
}
/**
 * 限量
 */
public class AmountLimitedDiscount extends DiscountStrategy {
    @Override
    public void shipping() {
        System.out.println("享受限量抢购折扣。。。。。。");
    }
}
public class Test {
    public static void main(String[] args) {

        PayStrategy weiXinPay=new WeiXinPay();
        PayStrategy aliPay=new AliPay();

        DiscountStrategy timeLimited=new TimeLimitedDiscount();
        DiscountStrategy amoutLimited=new AmountLimitedDiscount();

        //四种组合
        //1、微信支付+限时折扣
        PayContext context1=new PayContext(weiXinPay,timeLimited);
        context1.payment();
        System.out.println("---------------------------------------------");

        //2、微信支付+限量折扣
        PayContext context2=new PayContext(weiXinPay,amoutLimited);
        context2.payment();
        System.out.println("---------------------------------------------");

        //3、支付宝支付+限时折扣
        PayContext context3=new PayContext(aliPay,timeLimited);
        context3.payment();
        System.out.println("---------------------------------------------");

        //4、支付宝支付+限量折扣
        PayContext context4=new PayContext(aliPay,amoutLimited);
        context4.payment();
        System.out.println("---------------------------------------------");
    }
}

运行结果:

准备支付了。。。。。。
微信支付。。。。。。
享受限时抢购折扣。。。。。。
---------------------------------------------
准备支付了。。。。。。
微信支付。。。。。。
享受限量抢购折扣。。。。。。
---------------------------------------------
准备支付了。。。。。。
支付宝支付。。。。。。
享受限时抢购折扣。。。。。。
---------------------------------------------
准备支付了。。。。。。
支付宝支付。。。。。。
享受限量抢购折扣。。。。。。
---------------------------------------------
Process finished with exit code 0
作者:薄荷加冰
出处:https://www.cnblogs.com/huangjianping/
版权:本文版权归作者和博客园共有
转载:本文以学习、研究和分享为主,欢迎转载和各类爬虫,但必须在文章页面明显位置给出原文链接。 如果文中有不妥或者错误的地方还望您指出,以免误人子弟。如果您有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。
原文地址:https://www.cnblogs.com/huangjianping/p/14952080.html