考虑到商城消费策略经常改动,所以这里通过简单工厂来生成不同的消费策略。如打0.8折的消费策略,又如满300返100的消费策略。 代码结构:
1、抽象出商城消费策略
package simpleFactoryPattern; //抽象出收取现金的策略 public interface CashSupper { public double acceptCash(double money); }2、实现具体的消费策略
package simpleFactoryPattern; //正常的收费标准 public class CashNormal implements CashSupper{ @Override public double acceptCash(double money) { return money; } } package simpleFactoryPattern; //打折 public class CashRabete implements CashSupper{ public double moneyRabete = 1d; public CashRabete(double moneyRabete) { this.moneyRabete = moneyRabete; } @Override public double acceptCash(double money) { return money * moneyRabete; } } package simpleFactoryPattern; //返利 public class CashReturn implements CashSupper{ private double moneyCondition = 0.0d; private double moneyReturn = 0.0d; public CashReturn(double moneyCondition,double moneyReturn) { this.moneyCondition = moneyCondition; this.moneyReturn = moneyReturn; } @Override public double acceptCash(double money) { return money * Math.floor(moneyReturn/moneyCondition) * money; } }3、生成具体策略的工厂
package simpleFactoryPattern; public class CashStrategyFactory { public static CashSupper createCashSupper(String type){ CashSupper cs = null; switch(type){ case "正常消费": cs = new CashNormal(); break; case "满300返100": cs = new CashReturn(300, 100); break; case "打8折": cs = new CashRabete(0.8); break; } return cs; } }4、客户端Main
package simpleFactoryPattern; public class Main { public static void main(String[] args) { CashSupper cs = CashStrategyFactory.createCashSupper("正常消费"); double result = cs.acceptCash(100); System.out.println("当前消费金额:" + result); } }对于类似商城这样的程序,用策略模式来解决比工厂策略模式更优。 策略模式适应于程序内部执行策略需要经常改动的情况。如上面商城程序中对于消费策略的变动的频繁的,甚至不知道商城在什么时候用什么策略。 下面为策略模式的UML类图。
将商城程序用策略模式来实现
将策略抽象,让使用策略的类依赖抽象
package strategyPattern; public interface SupperStrategy { public double acceptCash(double money); }使用策略的类
package strategyPattern; public class StrategyContext { private SupperStrategy ss = null; public StrategyContext(SupperStrategy ss) { this.ss = ss; } public double acceptCash(double money){ return ss.acceptCash(money); } }策略的具体实现类
//正常消费 package strategyPattern; public class NormalStrategy implements SupperStrategy{ @Override public double acceptCash(double money) { return money; } } //返利消费 package strategyPattern; public class ReturnStrategy implements SupperStrategy{ private double moneyCondition = 0.0d; private double moneyReturn = 0.0d; public ReturnStrategy(double moneyCondition,double moneyReturn) { this.moneyCondition = moneyCondition; this.moneyReturn = moneyReturn; } @Override public double acceptCash(double money) { return money * Math.floor(moneyReturn/moneyCondition) * money; } } //打折消费 package strategyPattern; public class RabeteStrategy implements SupperStrategy{ public double moneyRabete = 1d; public RabeteStrategy(double moneyRabete) { this.moneyRabete = moneyRabete; } @Override public double acceptCash(double money) { return money * moneyRabete; } }Main客户端
package strategyPattern; /* * 对于经常需要变动的策略,例如超市打折,那么这里可用策略模式 */ public class Main { public static void main(String[] args) { SupperStrategy normalStrategy = new NormalStrategy(); //这里可以通过反射机制实现动态调整策略 StrategyContext context = new StrategyContext(normalStrategy); double result = context.acceptCash(100); System.out.println("第一种收费策略:"+result); SupperStrategy rabeteStrategy = new RabeteStrategy(0.8); //这里可以通过反射机制实现动态调整策略 StrategyContext context2 = new StrategyContext(rabeteStrategy); double result2 = context2.acceptCash(100); System.out.println("第二种收费策略:"+result2); } }