zoukankan      html  css  js  c++  java
  • 设计模式之策略模式

    模式定义

    策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。
    主要解决:在有多种算法相似的情况下,使用 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/
    版权:本文版权归作者和博客园共有
    转载:本文以学习、研究和分享为主,欢迎转载和各类爬虫,但必须在文章页面明显位置给出原文链接。 如果文中有不妥或者错误的地方还望您指出,以免误人子弟。如果您有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。
  • 相关阅读:
    【转载】为什么CPU有多层缓存
    【转载】二叉树的基本概念和实现
    【转载】如何系统地自学 Python?
    【原文】前端程序员必须知道的高性能Javascript知识
    【转载】重磅!中国人工智能/机器人/无人机创业公司100 | 智能内参
    【转载】分析重装系统也无法清除的鬼影病毒
    【转载】UML类图知识整理
    【转载】.NET程序员走向高端必读书单汇总
    【转载】齐次坐标的理解
    59. Spiral Matrix II
  • 原文地址:https://www.cnblogs.com/huangjianping/p/14952080.html
Copyright © 2011-2022 走看看