设计模式之策略模式

22 篇文章 0 订阅
1 篇文章 0 订阅

    写在前言,我这个设计模式系列的blog仅用于加强自己对设计模式的学习印象,大神勿喷,新入行的小朋友也不用照着我这个学,可以去看看写得更加好的一些专业书,比如java大话设计模式,还有那本设计模式圣经。

   首先我设计了一个策略接口,然后设计了三种策略实现这个接口,接着就是一个管理策略类的抽象类,用一个具体实现类继承这个抽象类,最后就使用一个主类来写调用这些策略了。

代码如下

策略接口:

package com.freshbin.pattern.strategy.discount;

/**
 * 打折接口
 * @author freshbin
 * @date 2019-1-2 16:36:44
 */
public interface DiscountStrategy {
	public String describe();
	public double discount();
}

三个策略实现类:

package com.freshbin.pattern.strategy.discount;

/**
 * 大优惠活动
 * 
 * @author freshbin
 * @date 2019-1-2 16:36:21
 */
public class BigDiscount implements DiscountStrategy {

	@Override
	public double discount() {
		return 0.1;
	}

	@Override
	public String describe() {
		return "这是打一折卖血方案";
	}

}
package com.freshbin.pattern.strategy.discount;

/**
 * 打三折活动
 * 
 * @author freshbin
 * @date 2019-1-2 16:36:21
 */
public class ThreeDiscount implements DiscountStrategy {

	@Override
	public double discount() {
		return 0.3;
	}

	@Override
	public String describe() {
		return "这是打三折方案";
	}

}
package com.freshbin.pattern.strategy.discount;

/**
 * 小优惠活动
 * 
 * @author freshbin
 * @date 2019-1-2 16:36:21
 */
public class SmallDiscount implements DiscountStrategy {

	@Override
	public double discount() {

		return 0.9;
	}

	@Override
	public String describe() {
		return "这是打九折方案";
	}

}

管理策略类的抽象类:

package com.freshbin.pattern.strategy.container.mall;

import com.freshbin.pattern.strategy.discount.DiscountStrategy;

/**
 * 管理商城的打折活动
 * @author freshbin
 * @date 2019-1-2 16:39:14
 */
public abstract class ManagerMallStrategy {
	
	DiscountStrategy discountStrategy;
	
	public ManagerMallStrategy() {

	}
	
	public abstract double discount(Integer discountStrategyParam);
}

继承抽象类的具体实现类:

package com.freshbin.pattern.strategy.container.mall;

import java.util.HashMap;
import java.util.Map;

import com.freshbin.pattern.strategy.discount.BigDiscount;
import com.freshbin.pattern.strategy.discount.DiscountStrategy;
import com.freshbin.pattern.strategy.discount.SmallDiscount;
import com.freshbin.pattern.strategy.discount.ThreeDiscount;

/**
 * 具体的打折策略方案
 * @author freshbin
 * @date 2019-1-2 16:43:57
 */
public class MallDiscountImpl extends ManagerMallStrategy {

	public static Map<Integer, DiscountStrategy> discountStrategyMap = new HashMap<>();
	
	static {
		discountStrategyMap.put(1, new BigDiscount());
		discountStrategyMap.put(2, new SmallDiscount());
		discountStrategyMap.put(3, new ThreeDiscount());
	}
	
	public MallDiscountImpl() {
		
	}
	
	@Override
	public double discount(Integer discountStrategyParam) {
		if(!discountStrategyMap.containsKey(discountStrategyParam)) {
			return 0;
		}
		return discountStrategyMap.get(discountStrategyParam).discount();
	}

}

客户端主类:

package com.freshbin.pattern.strategy;

import java.util.Map;
import java.util.Scanner;

import com.freshbin.pattern.strategy.container.mall.MallDiscountImpl;
import com.freshbin.pattern.strategy.container.mall.ManagerMallStrategy;
import com.freshbin.pattern.strategy.discount.BigDiscount;
import com.freshbin.pattern.strategy.discount.DiscountStrategy;
import com.freshbin.pattern.strategy.discount.SmallDiscount;

/**
 * 商城主类
 * 
 * @author freshbin
 * @date 2019-1-2 16:41:35
 */
public class ShoppingMall {
	
	private static double price = 50;
	
	public static void main(String[] args) {
		System.out.println("欢迎光临!");
		
		System.out.println("目前有以下" + MallDiscountImpl.discountStrategyMap.size() + "种打折方案!");
		int i = 1;
		for(Map.Entry<Integer, DiscountStrategy> entry : MallDiscountImpl.discountStrategyMap.entrySet()) {
			System.out.println("第" + i + "种方案:" + entry.getValue().describe());
			i++;
		}
		
		System.out.println("请输入您的选择(输入0则退出):");
		Scanner in = new Scanner(System.in);
		int choose = in.nextInt();
		
		while(choose != 0) {
			ManagerMallStrategy mallStrategyThree = new MallDiscountImpl();
			double discount = mallStrategyThree.discount(choose);
			System.out.println("您选择该优惠后的价格:" + price*discount);
			
			System.out.println("===================================================");
			
			System.out.println("请继续您的选择(输入0则退出):");
			int j = 1;
			for(Map.Entry<Integer, DiscountStrategy> entry : MallDiscountImpl.discountStrategyMap.entrySet()) {
				System.out.println("第" + j + "种方案:" + entry.getValue().describe());
				j++;
			}
			
			choose = in.nextInt();
		}
		
		System.out.println("您慢走,欢迎下次惠顾啊!");
	}
}

如果需要加入新的策略,则实现策略接口,然后在策略管理类中,把这个新的策略加入到Map中即可。

以上就是我一个简单的策略模式的例子。

接下来,是演示图:

 代码见github:https://github.com/freshbin/designPattern

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值