Strategy学习笔记

首先看一下策略模式的UML图Strategy学习笔记


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)); } }
Strategy学习笔记

源码已经上传,有需要的童鞋可以看一下http://download.****.net/source/3571017


初次发表文章,难免有的地方说的不够通顺和一些对策略模式认识不够透彻的地方,欢迎各位拍砖一起讨论学习,共同进步!!!