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

    策略模式:是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。

    这个模式涉及到三个角色:
    1、环境(Price)角色:持有一个Strategy的引用;
    2、抽象策略(MemberStrategy)角色:这是一个抽象角色,通常有一个接口或者抽象类实现。此角色给出所有的具体策略类所需的接口。
    3、具体策略(PrimaryMemberStrategy、IntermediateMemberStrategy、AdvancedMemberStrategy)角色:包装了相关的算法或者行为。

    使用场景

    针对不同会员等级提供促销折扣:
         算法一:对初级会员没有折扣。
      算法二:对中级会员提供10%的促销折扣。
      算法三:对高级会员提供20%的促销折扣。
    源代码:
    /**
     * 抽象接口类
     */
    public interface MemberStrategy {
    
        /**
         * 计算图书的价格
         *
         * @param booksPrice 图书的原价
         * @return 计算出打折后的价格
         */
        double calcPrice(double booksPrice);
    }
    /**
     * 初级会员策略算法类
     */
    public class PrimaryMemberStrategy implements MemberStrategy {
    
        @Override
        public double calcPrice(double booksPrice) {
            System.out.println("对于初级会员的没有折扣");
            return booksPrice;
        }
    }
    /**
     * 中级会员策略算法类
     */
    public class IntermediateMemberStrategy implements MemberStrategy {
    
        @Override
        public double calcPrice(double booksPrice) {
            System.out.println("对于中级会员的折扣为10%");
            return booksPrice * 0.9;
        }
    }
    /**
     * 高级会员策略算法类
     */
    public class AdvancedMemberStrategy implements MemberStrategy {
    
        @Override
        public double calcPrice(double booksPrice) {
            System.out.println("对于高级会员的折扣为20%");
            return booksPrice * 0.8;
        }
    }
    /**
     * 持有策略对象的价格类
     */
    public class Price {
        //持有一个具体的策略对象
        private MemberStrategy memberStrategy;
        /**
         * 构造函数,传入一个具体的策略对象
         *
         * @param memberStrategy 具体的策略对象
         */
        public Price(MemberStrategy memberStrategy) {
            this.memberStrategy = memberStrategy;
        }
        /**
         * 计算图书价格
         *
         * @param booksPrice 图书原价
         * @return 计算出打折后的价格
         */
        public double quote(double booksPrice) {
            return this.memberStrategy.calcPrice(booksPrice);
        }
    }
    /**
     * 对高级会员进行使用策略方案
     */
    public class StrategyMain {
    
        public static void main(String[] args) {
            //选择并创建需要使用的策略对象
            MemberStrategy memberStrategy = new AdvancedMemberStrategy();
            //将策略对象放入需要具体策略的类
            Price price = new Price(memberStrategy);
            //计算价格
            double quote = price.quote(300);
            System.out.println("图书的最终价格为:" + quote);
        }
    }

    运行结果:

  • 相关阅读:
    harbor无法登陆解决
    k8s中使用harbor
    harbor扩容
    harbor设置开机自启
    设置开机自启
    关Java的内存模型(JMM)
    多线程相关概念
    多线程(JDK1.5的新特性互斥锁)
    synchronized关键字
    【异常】redis.clients.jedis.exceptions.JedisDataException: ERR unknown command 'PSETEX'
  • 原文地址:https://www.cnblogs.com/hujinshui/p/9451597.html
Copyright © 2011-2022 走看看