商场中计算价格,经常为有很多促销方式。
面向对象的精髓在于抽象出相同的部分已符合人类的思维方式。
当有很多种算法可以替换(比如商品价格算法时),可以使用策略模式。
UML图:
Strategy为策略基类,所有商品价格的计算都是一种算法而已。
ContextInterface用来封装具体算法,从而使客户端与价格计算分离。
定义strtegy的interface:
package com.jayfulmath.designpattern.strategy; public interface ICashSuper { public double acceptCash(double money); }
然后是各种促销的算法:
package com.jayfulmath.designpattern.strategy; public class CashSale implements ICashSuper { private double monryrate = 1d; public CashSale(String monryrateStr) { this.monryrate = Double.parseDouble(monryrateStr); } @Override public double acceptCash(double money) { return monryrate*money; } }
package com.jayfulmath.designpattern.strategy; public class CashReturn implements ICashSuper { private double moneyCondition = 0.0d; private double moneyReturn = 0.0d; public CashReturn(String moneyConditionStr, String moneyReturnStr) { try { moneyCondition = Double.parseDouble(moneyConditionStr); moneyReturn = Double.parseDouble(moneyReturnStr); } catch (Exception e) { System.out.println("parse condition wrong:" + moneyCondition + " moneyReturn:" + moneyReturn); } } @Override public double acceptCash(double money) { double result = 0.0d; if(money>=moneyCondition) { result = money-Math.floor(money/moneyCondition)*moneyReturn; } return result; } }
package com.jayfulmath.designpattern.strategy; public class CashReturn implements ICashSuper { private double moneyCondition = 0.0d; private double moneyReturn = 0.0d; public CashReturn(String moneyConditionStr, String moneyReturnStr) { try { moneyCondition = Double.parseDouble(moneyConditionStr); moneyReturn = Double.parseDouble(moneyReturnStr); } catch (Exception e) { System.out.println("parse condition wrong:" + moneyCondition + " moneyReturn:" + moneyReturn); } } @Override public double acceptCash(double money) { double result = 0.0d; if(money>=moneyCondition) { result = money-Math.floor(money/moneyCondition)*moneyReturn; } return result; } }
package com.jayfulmath.designpattern.strategy; public class CashNormal implements ICashSuper { @Override public double acceptCash(double money) { return money; } }
用工厂类封装的contextinterface方法:
package com.jayfulmath.designpattern.strategy; import java.text.DecimalFormat; public class CashContext { private ICashSuper cs = null; public CashContext(String type) { System.out.println("商品促销活动"+type); switch(type) { case "Normal": cs = new CashNormal(); break; case "Return 100 Reach 300": cs = new CashReturn("300.0", "100.0"); break; case "80%Sale": cs = new CashSale("0.8"); break; default: System.out.println("没有符合的商品促销活动"); break; } } public double getResult(double money) { double result = money; if(cs != null) { result = cs.acceptCash(money); } String resultstr = new DecimalFormat("0.00").format(result); result = Double.parseDouble(resultstr); return result; } }
package com.jayfulmath.designpattern.strategy; import java.text.DecimalFormat; public class CashContext { private ICashSuper cs = null; public CashContext(String type) { System.out.println("商品促销活动"+type); switch(type) { case "Normal": cs = new CashNormal(); break; case "Return 100 Reach 300": cs = new CashReturn("300.0", "100.0"); break; case "80%Sale": cs = new CashSale("0.8"); break; default: System.out.println("没有符合的商品促销活动"); break; } } public double getResult(double money) { double result = money; if(cs != null) { result = cs.acceptCash(money); } String resultstr = new DecimalFormat("0.00").format(result); result = Double.parseDouble(resultstr); return result; } }
main方法:
package com.jayfulmath.designpattern.strategy; import com.jayfulmath.designpattern.main.BasicExample; public class StrategyMain extends BasicExample { @Override public void startDemo() { // TODO Auto-generated method stub CashContext cc = null; Commodity shoes = new Commodity("shoe", 123.5, 5); Commodity cloths = new Commodity("cloths", 323.2, 6); Commodity apple = new Commodity("apple", 15.62, 25); cc = new CashContext("70%Sale"); double result = cc.getResult(shoes.getTotalPrice() + cloths.getTotalPrice() + apple.getTotalPrice()); System.out.println("Total price is:"+result); } }
最后是商品类:
package com.jayfulmath.designpattern.strategy; public class Commodity { public String _name; private double _price; private int _count; public double get_price() { return _price; } public void set_price(double _price) { this._price = _price; } public String get_name() { return _name; } public void set_name(String _name) { this._name = _name; } /** * @return the _count */ public int get_count() { return _count; } /** * @param _count the _count to set */ public void set_count(int _count) { this._count = _count; } public Commodity(String _name, double _price, int _count) { this._name = _name; this._price = _price; this._count = _count; System.out.println("买入商品"+_name+" "+_count+"个"+"单价"+_price); } public double getTotalPrice() { return _count*_price; } }
运行结果:
买入商品shoe 5个单价123.5 买入商品cloths 6个单价323.2 买入商品apple 25个单价15.62 商品促销活动80%Sale Total price is:2357.76
策略模式的特点就是:对于各种策略(或者说算法)进行抽象封装,并且通过contextinterface工厂类来进一步封装,
客户端只需要告诉contextinterface使用哪一个算法就可以。