文档章节

策略模式

清尘V
 清尘V
发布于 2016/04/28 11:12
字数 573
阅读 20
收藏 1

策略模式讲求的是策略:多个策略是平等的,究竟使用哪一个策略完全取决于调用者,策略之间切换不需要任何改动

示例:商城会员分为普通会员和VIP会员;普通会员购买东西不打折,VIP会员购买东西打8折;折扣这块就可以抽象为一个策略接口,具体使用哪一种打折完全取决于用户等级

最容易想到的一种实现方式:

package com.whereta.strategy;

/**
 * Vincent 创建于 2016/4/28.
 */
public class MemberDiscount {

    public double discount(int i, float price) {
        if (i == 1) {
            return price;
        } else if (i == 20) {
            return 0.8 * price;
        }
        return -1;
    }

}

如果要新加一种SVIP,那么就要修改代码了

现在看策略模式实现:

package com.whereta.strategy;

/**
 * Vincent 创建于 2016/4/27.
 */
public interface IMember {
    /**
     * 根据不同等级享受不同折扣
     * @param price
     * @return
     */
    double discount(float price);

}
package com.whereta.strategy;

/**
 * Vincent 创建于 2016/4/27.
 */
public class CommonMember implements IMember {
    //普通会员不享受折扣
    public double discount(float price) {
        return price;
    }
}
package com.whereta.strategy;

/**
 * Vincent 创建于 2016/4/27.
 */
public class VIPMember implements IMember {
    //普通会员享受8折
    public double discount(float price) {
        return 0.8 * price;
    }
}
package com.whereta.strategy;

/**
 * Vincent 创建于 2016/4/27.
 * 此处如果实现了IMember接口,那就是代理模式
 */
public class Context {

    private IMember member;

    public Context(IMember member) {
        this.member = member;
    }
    //根据member获取实际需要支付的现金
    public double discount(float price){
        return member.discount(price);
    }


}
package com.whereta.strategy;

/**
 * Vincent 创建于 2016/4/27.
 */
public class Main {
    public static void main(String[] args) {
        Context context=new Context(new CommonMember());
        double cash = context.discount(200f);
        System.out.println("普通会员:"+cash);
        context=new Context(new VIPMember());
        cash = context.discount(200f);
        System.out.println("VIP会员:"+cash);
    }
}

从以上接口看出与代理模式特别相似,但是不同点是Context没有实现IMember接口

现在如果要新加一个SVIP,只要实现IMember接口即可,不需要修改其他两个实现类

现在升级下:策略枚举

package com.whereta.strategy;

/**
 * Vincent 创建于 2016/4/28.
 */
public enum MemberEnum {
    VIP {
        public double discount(float price) {
            return 0.8 * price;
        }
    }, COMMON {
        public double discount(float price) {
            return price;
        }
    };


    public abstract double discount(float price);
}

具体使用:

double discount = MemberEnum.COMMON.discount(23f);

策略枚举适用于很少变动的情况


个人博客:http://www.whereta.com

© 著作权归作者所有

上一篇: 对象访问定位
下一篇: java对象创建分析
清尘V

清尘V

粉丝 41
博文 107
码字总数 47780
作品 0
青岛
程序员
私信 提问

暂无文章

利用CSS禁止手机长按出现气泡: 复制、选择等功能

可以用 * ,也可作用于一个div div{  -webkit-touch-callout:none;  /*系统默认菜单被禁用*/  -webkit-user-select:none; /*webkit浏览器*/  -khtml-user-select:none; /*早期浏览...

蓝小驴
51分钟前
7
0
前端的一些雕虫小技,从100%和滚动条说起

1、100%和滚动条 当我们在css中把html和body同时设为100%时,会出现滚动条 html, body { width: 100%; height: 100%; } 原因是html和b...

wphmoon
今天
8
0
电力区块链应用案例【2019】

随着区块链技术的日益普及,出现了大量创业企业尝试使用区块链技术来解决能源与电力行业中存在的问题。在本文中,我们将介绍其中的三个能源区块链项目。 能源行业以价格不透明著称:消费者很...

汇智网教程
今天
12
0
聊聊rocketmq的adjustThreadPoolNumsThreshold

序 本文主要研究一下rocketmq的adjustThreadPoolNumsThreshold DefaultMQPushConsumer rocketmq-client-4.5.2-sources.jar!/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.ja......

go4it
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部