首先看一下策略模式的UML图
Strategy通常是一个接口,其中定义抽象的算法接口,具体实现具体策略子类(ConcreteStrategy)来实现。
Context定义了对策略类的算法方法的调用以完成具体的逻辑,Context对Strategy类的调用不管是如何实现的,只要可以完成功能即可。
ConcreteStrategy完成策略接口中定义的方法,不同的实现子类对Strategy抽象层的实现也不相同。
一个简单的例子,一个商场中可以有不同的购物区,每个区域在不同的时节和情况下会有相应的折扣
首先建立一个抽象Market类包含购物区的一些基本属性和方法
package com.akwolf.strategymarket;
public abstract class Market {
protected Onsale onsale;
public Market() {
// 默认无折扣
onsale = new OnsaleNone();
}
/**
* 各个商场用来结算最终金额的方法
*
* @param price 商品总价
* @return
*/
public abstract float calculatePrice(float price);
public Onsale getOnsale() {
return onsale;
}
public void setOnsale(Onsale onsale) {
this.onsale = onsale;
}
}
让不同的购物区实现Market以实现一个简单的从原始价得到打折后价格的功能
package com.akwolf.strategymarket;
public class ClothesMarket extends Market {
@Override
public float calculatePrice(float price) {
return onsale.saleRate() * price;
}
}
FoodMarket:
package com.akwolf.strategymarket;
public class FoodMarket extends Market {
@Override
public float calculatePrice(float price) {
return price * onsale.saleRate();
}
}
建立打折的接口(Onsale)相当于Stratety接口,供不同的打折类型拓展,因为打折的类型可能很多,也具有不确定性
package com.akwolf.strategymarket;
public interface Onsale {
public float saleRate();
}
剩下就是让不同的打折类型拓展自打折接口,以便在不同的购物区被使用
package com.akwolf.strategymarket;
/**
* 秋季打折
*
* @author zhanghua
*
*/
public class OnsaleAutumn implements Onsale {
@Override
public float saleRate() {
return 0.88f;
}
}
package com.akwolf.strategymarket;
/**
* 春节打折
*
* @author zhanghua
*
*/
public class OnsaleSpring implements Onsale {
@Override
public float saleRate() {
return 0.5f;
}
}
建立一个类测试一些运行效果
package com.akwolf.strategymarket;
public class MainTest {
public static void main(String[] args) {
Market market ;
Onsale onsale ;
//秋天了收获的季节,食物和衣服都打折
onsale = new OnsaleAutumn() ;
market = new ClothesMarket() ;
//买了一件衣服得到打折后的价格
market.setOnsale(onsale) ;
System.out.println(market.calculatePrice(50));
//在食品区买了150元的食品得到打折后的价格
market = new FoodMarket() ;
market.setOnsale(onsale) ;
System.out.println(market.calculatePrice(150));
System.out.println("---------------");
//春节在食品区买东西享受春节优惠,
onsale = new OnsaleSpring() ;
market = new FoodMarket() ;
market.setOnsale(onsale) ;
System.out.println(market.calculatePrice(300));
//衣服不打折了
market = new ClothesMarket() ;
System.out.println(market.calculatePrice(200));
}
}

源码已经上传,有需要的童鞋可以看一下http://download.youkuaiyun.com/source/3571017
初次发表文章,难免有的地方说的不够通顺和一些对策略模式认识不够透彻的地方,欢迎各位拍砖一起讨论学习,共同进步!!!