应用案例:商场促销的多样性(折扣,满减)
package Strategy; //简单工厂模式实现 public class CashFactory { public static CashSuper createCashAccept(String type) { CashSuper cs = null; switch(type) { case "正常收费": cs = new CashNormal(); break; case "满300返100": cs = new CashReturn("300","100"); break; case "打8折": cs = new CashRebate("0.8"); break; } return cs; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub double total = 0.0d,totalprice = 1000d; CashSuper csuper = CashFactory.createCashAccept("正常收费"); total = csuper.acceptCash(totalprice); System.out.println(total); total = 0.0d; totalprice = 1000d; csuper = CashFactory.createCashAccept("满300返100"); total = csuper.acceptCash(totalprice); System.out.println(total); total = 0.0d; totalprice = 1000d; csuper = CashFactory.createCashAccept("打8折"); total = csuper.acceptCash(totalprice); System.out.println(total); } } abstract class CashSuper { public abstract double acceptCash(double money); } class CashNormal extends CashSuper { @Override public double acceptCash(double money) { return money; } } class CashRebate extends CashSuper { private double moneyRebate = 1d; public CashRebate(String moneyRebate) { this.moneyRebate = Double.parseDouble(moneyRebate); } @Override public double acceptCash(double money) { return money * moneyRebate; } } class CashReturn extends CashSuper { private double moneyCondition = 0.0d; private double moneyReturn = 0.0d; public CashReturn(String moneyCondition, String moneyReturn) { this.moneyCondition = Double.parseDouble(moneyCondition); this.moneyReturn = Double.parseDouble(moneyReturn); } @Override public double acceptCash(double money) { double result = money; if (money >= moneyCondition) { result = money - Math.floor(money/this.moneyCondition) * this.moneyReturn; } return result; } }
策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用的算法客户。
Context是一个配置管理类,持有一个Strategy抽象类对象,构造函数用于初始化该对象,Context封装了Strategy的抽象方法调用。
简言之,以算法类为参数配置管理类,配置管理类对算法调用进行了封装
package Strategy; abstract class CashSuper { public abstract double acceptCash(double money); } class CashNormal extends CashSuper { @Override public double acceptCash(double money) { return money; } } class CashRebate extends CashSuper { private double moneyRebate = 1d; public CashRebate(String moneyRebate) { this.moneyRebate = Double.parseDouble(moneyRebate); } @Override public double acceptCash(double money) { return money * moneyRebate; } } class CashReturn extends CashSuper { private double moneyCondition = 0.0d; private double moneyReturn = 0.0d; public CashReturn(String moneyCondition, String moneyReturn) { this.moneyCondition = Double.parseDouble(moneyCondition); this.moneyReturn = Double.parseDouble(moneyReturn); } @Override public double acceptCash(double money) { double result = money; if (money >= moneyCondition) { result = money - Math.floor(money / this.moneyCondition) * this.moneyReturn; } return result; } } public class CashContext { private CashSuper cs; public CashContext(CashSuper csuper) { this.cs = csuper; } public double GetResult(double money) { return cs.acceptCash(money); } public static void main(String[] args) { // TODO Auto-generated method stub CashContext cc = null; String type = "正常收费"; switch(type) { case "正常收费": cc = new CashContext(new CashNormal()); break; case "满300返100": cc = new CashContext(new CashReturn("300","100")); break; case "打8折": cc = new CashContext(new CashRebate("0.8")); break; } double total = 0.0d,totalprice = 1000d; total = cc.GetResult(totalprice); System.out.println(total); total = 0.0d; totalprice = 1000d; cc = new CashContext(new CashReturn("300","100")); total = cc.GetResult(totalprice); System.out.println(total); total = 0.0d; totalprice = 1000d; cc = new CashContext(new CashRebate("0.8")); total = cc.GetResult(totalprice); System.out.println(total); } }
还是通过配置类,配置算法类,只是在内部用工厂方法产生
package Strategy; abstract class CashSuper { public abstract double acceptCash(double money); } class CashNormal extends CashSuper { @Override public double acceptCash(double money) { return money; } } class CashRebate extends CashSuper { private double moneyRebate = 1d; public CashRebate(String moneyRebate) { this.moneyRebate = Double.parseDouble(moneyRebate); } @Override public double acceptCash(double money) { return money * moneyRebate; } } class CashReturn extends CashSuper { private double moneyCondition = 0.0d; private double moneyReturn = 0.0d; public CashReturn(String moneyCondition, String moneyReturn) { this.moneyCondition = Double.parseDouble(moneyCondition); this.moneyReturn = Double.parseDouble(moneyReturn); } @Override public double acceptCash(double money) { double result = money; if (money >= moneyCondition) { result = money - Math.floor(money / this.moneyCondition) * this.moneyReturn; } return result; } } public class CashContext { private CashSuper cs; public CashContext(String type) { switch(type) { case "正常收费": cs = new CashNormal(); break; case "满300返100": cs = new CashReturn("300","100"); break; case "打8折": cs =new CashRebate("0.8"); break; } } public double GetResult(double money) { return cs.acceptCash(money); } public static void main(String[] args) { // TODO Auto-generated method stub CashContext cc = null; double total = 0.0d,totalprice = 1000d; cc = new CashContext("正常收费"); total = cc.GetResult(totalprice); System.out.println(total); total = 0.0d; totalprice = 1000d; cc = new CashContext("满300返100"); total = cc.GetResult(totalprice); System.out.println(total); total = 0.0d; totalprice = 1000d; cc = new CashContext("打8折"); total = cc.GetResult(totalprice); System.out.println(total); } }