写在前言,我这个设计模式系列的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中即可。
以上就是我一个简单的策略模式的例子。
接下来,是演示图: