Strategy学习笔记

来源:互联网 发布:网页美工属于web什么 编辑:程序博客网 时间:2024/06/05 23:58

首先看一下策略模式的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 {@Overridepublic float calculatePrice(float price) {return onsale.saleRate() * price;}}

FoodMarket:

package com.akwolf.strategymarket;public class FoodMarket extends Market {@Overridepublic 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 {@Overridepublic float saleRate() {return 0.88f;}}
package com.akwolf.strategymarket;/** * 春节打折 *  * @author zhanghua *  */public class OnsaleSpring implements Onsale {@Overridepublic 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.csdn.net/source/3571017


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



原创粉丝点击