java-设计模式(行为型)-【策略模式】
1.策略模式(StrategyMode)
定义:属于java的行为型模式,遵循开闭原则(对扩展开放,对修改关闭),能有效减少面向过程的if-else语句,
策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。
使用场景:适用于将不同的算法各自封装,用户端可以随意挑选需要的算法。
2.在线支付例子
某支付系统接入以下几种商户进行充值:假如分为四种,手机支付,网银支付,商户账号支付和点卡支付。
如下:
①网银充值,8.5折;
②商户充值,9折;
③手机充值,没有优惠;
④点卡充值,收取1%的渠道费;
3.图解
4.枚举类(支付)
//四种的支付手段 public enum PayMode { BANK(1,"网银充值"),ACCOUNT(2,"商户充值"),MOBILE(3,"手机充值"),CARD(4,"点卡充值"); private int value; private String mode; PayMode(int value,String mode) { value=value; mode=mode; } }
5.策略类
public interface Strategy { double getSum(double money); } //①网银充值,8.5折; //②商户充值,9折; //③手机充值,没有优惠; //④点卡充值,收取1%的渠道费; class BankStra implements Strategy { @Override public double getSum(double money) { // TODO Auto-generated method stub return money*0.85; } } class AccountStra implements Strategy { @Override public double getSum(double money) { // TODO Auto-generated method stub return money*0.9; } } class MobileStra implements Strategy { @Override public double getSum(double money) { // TODO Auto-generated method stub return money; } } class CardStra implements Strategy { @Override public double getSum(double money) { // TODO Auto-generated method stub return money*1.01; } }
6.生产策略类的工厂(单态设计模式:已经静态保存了四种策略,保证线程同步)
//策略工厂:设计为单态模式,保持线程安全,用个池保存具体策略。 class StrategyFactory { private static Hashtable <Integer ,Strategy> ht=new Hashtable<Integer,Strategy>(); private static StrategyFactory factory=new StrategyFactory(); private StrategyFactory() { } static{ ht.put(1, new BankStra()); ht.put(2,new AccountStra()); ht.put(4,new CardStra()); ht.put(3, new MobileStra()); } public static StrategyFactory getInstance() { return factory; } public Strategy getStrategy(int value) { return ht.get(value); } }
7.场景类:根据用户的不同要求使用不同的策略
public class Context { //计算指定支付方式的费用 public double getReCharge(int value, double money) { // TODO Auto-generated method stub Strategy strat=StrategyFactory.getInstance().getStrategy(value); return strat.getSum( money); } }
8.测试
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Context context=new Context(); double charge=context.getReCharge(1, 100); System.out.println(charge); double charge2=context.getReCharge(2, 100); System.out.println(charge2); } }
9.运行结果
85.0 90.0