定义
定义了算法家族,分别封装起来,让他们之间可以互相替换,算法的变化不会影响到使用算法的用户,能够减少if...else
的使用
适用场景
- 系统有很多类,区别仅在行为不同
- 系统需要动态的采用不同算法
优点
- 符合开闭原则
- 避免使用多重条件转移语句
- 提高算法保密性和安全性
缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
- 会产生很多策略类
代码
以商场促销为例,定义促销方式接口Promotion
,并创建具体策略促销算法FanxianPromotion
和ManjianPromotion
,购物活动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();
}
}