策略模式

定义

定义了算法家族,分别封装起来,让他们之间可以互相替换,算法的变化不会影响到使用算法的用户,能够减少if...else的使用

适用场景

  • 系统有很多类,区别仅在行为不同
  • 系统需要动态的采用不同算法

优点

  • 符合开闭原则
  • 避免使用多重条件转移语句
  • 提高算法保密性和安全性

缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
  • 会产生很多策略类

代码

以商场促销为例,定义促销方式接口Promotion,并创建具体策略促销算法FanxianPromotionManjianPromotion,购物活动Shopping持有接口并接收具体的促销策略实现促销。

public interface Promotion {
void doPromotion();
}
public class FanxianPromotion implements Promotion{

@Override
public void doPromotion() {
System.out.println("返现促销");	
}
}
public class ManjianPromotion implements Promotion{

@Override
public void doPromotion() {
System.out.println("满减促销");
}

}
public class Shopping {
private Promotion promotion;

public Shopping(Promotion promotion) {
super();
this.promotion = promotion;
}

public void run(){
promotion.doPromotion();
}

}

public class Test {

public static void main(String[] args) {

Shopping shop618 = new Shopping(new ManjianPromotion());
shop618.run();

Shopping shop111 = new Shopping(new FanxianPromotion());
shop111.run();
}

}
满减促销
返现促销

策略+工厂+单例

传统每次都要new一个策略对象,实际上策略对象有限,可以以容器单例的形式实现并通过工厂管理
创建了无促销活动的策略实现友好返回

public class NonePromotion implements Promotion{

@Override
public void doPromotion() {
System.out.println("无促销");
}

}
public class PromotionFactory {
	private static Map<String,Promotion> map = new HashMap<String, Promotion>();

static{
	map.put(PromotionKey.FANXIAN,new FanxianPromotion());
	map.put(PromotionKey.MANJIAN,new ManjianPromotion());
}

private static final Promotion NON_PROMOTION = new NonePromotion();

private PromotionFactory(){

}

public static Promotion getPromotion(String key){
	Promotion p = map.get(key);
	return p == null ?  NON_PROMOTION : p;
}

private interface PromotionKey{
	String FANXIAN = "FANXIAN";
	String MANJIAN = "MANJIAN";
	}
}
public class Test {

public static void main(String[] args) throws Exception{

String key = "MANJIAN";
Promotion p = PromotionFactory.getPromotion(key);
Shopping s = new Shopping(p);
s.run();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值