美文网首页Android知识Android开发Java学习笔记
代码段简单学习设计模式 -- 策略模式

代码段简单学习设计模式 -- 策略模式

作者: GYLEE | 来源:发表于2017-06-03 15:43 被阅读59次

    策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

    1.策略模式结构

    ● 环境(Context)角色:持有一个Strategy的引用。

    ● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

    ● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

    策略模式结构图

    2.源代码

    使用场景

    假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。
      根据描述,折扣是根据以下的几个算法中的一个进行的:
      算法一:对初级会员没有折扣。
      算法二:对中级会员提供10%的促销折扣。
      算法三:对高级会员提供20%的促销折扣。

    抽象策略(Strategy)角色类

    public interface MemberStrategy {
        /**
         * 计算图书的价格
         * @param booksPrice    图书的原价
         * @return    计算出打折后的价格
         */
        public double calcPrice(double booksPrice);
    }
    

    具体策略(ConcreteStrategy)角色:

    //初级会员-- 算法1
    public class PrimaryMemberStrategy implements MemberStrategy {
        @Override
        public double calcPrice(double booksPrice) { 
            System.out.println("对于初级会员的没有折扣");
            return booksPrice;
        }
    }
    
    //中级会员--算法2
    public class IntermediateMemberStrategy implements MemberStrategy {
        @Override
        public double calcPrice(double booksPrice) {
            System.out.println("对于中级会员的折扣为10%");
            return booksPrice * 0.9;
        }
    
    }
    
    //高级会员--算法3
    public class AdvancedMemberStrategy implements MemberStrategy {
        @Override
        public double calcPrice(double booksPrice) {        
            System.out.println("对于高级会员的折扣为20%");
            return booksPrice * 0.8;
        }
    }
    

    环境(Context)角色

    public class Price {
        //持有一个具体的策略对象
        private MemberStrategy strategy;
        /**
         * 构造函数,传入一个具体的策略对象
         * @param strategy    具体的策略对象
         */
        public Price(MemberStrategy strategy){
            this.strategy = strategy;
        }
        /**
         * 计算图书的价格
         * @param booksPrice    图书的原价
         * @return    计算出打折后的价格
         */
        public double quote(double booksPrice){
            return this.strategy.calcPrice(booksPrice);
        }
    }
    

    具体使用方式

    public class User {
        public static void main(String[] args) {
            //选择并创建需要使用的策略对象
            MemberStrategy strategy = new AdvancedMemberStrategy();
            //创建环境
            Price price = new Price(strategy);
            //计算价格
            double quote = price.quote(300);
            System.out.println("图书的最终价格为:" + quote);
        }
    
    }
    

    相关文章

      网友评论

        本文标题:代码段简单学习设计模式 -- 策略模式

        本文链接:https://www.haomeiwen.com/subject/uofmfxtx.html