java策略模式拙见
面向对象的两个基本准则:
单一职责:一个类只有一个发生变化的原因
开闭原则:对拓展开放,对修改关闭
《Java开发手册》中,有这样的规则:超过3层的 if-else 的逻辑判断代码可以使用卫语句、策略模式、状态模式等来实现。
在代码中纵使采用if/else也可以达到要求,但是如果过度采用这种方式会导致代码极为复杂,后期维护及拓展相当困难。因此策略模式可以用来解决这种困扰
问:怎么使用策略模式
首先明白,什么是策略模式
:通过分割使用算法、实现算法主体进而拆除复杂繁琐的if/else方法体的一种编程思想
策略模式的优点
1、降低了多重条件语句伴随的维护难度高的问题
2、恰当的使用了继承,减少了冗余代码
3、贴合开闭原则,保证尽可能少对原代码更改的前提新增了功能
策略模式的缺点
:随着策略的不断增多会导致策略类数量庞大(可通过混合模式解决)
实现的方式
1、定义公有策略接口IStrategyService及策略方法doOperation(Object arg)
2、根据需要采用的策略,实现策略接口,定义策略实现类StrategyServiceImpl
3、使用策略实现类
1 public class Context { 2 private Strategy strategy; 3 4 public Context(Strategy strategy){ 5 this.strategy = strategy; 6 } 7 8 public int executeStrategy(int num1, int num2){ 9 return strategy.doOperation(num1, num2); 10 } 11 }
1 public class StrategyPatternDemo { 2 public static void main(String[] args) { 3 Context context = new Context(new OperationAdd()); 4 System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); 5 6 context = new Context(new OperationSubtract()); 7 System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); 8 9 context = new Context(new OperationMultiply()); 10 System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); 11 } 12 }
现在,尝试自己使用策略模式
使用场景,支付
支付方式可以有多种,包括支付宝、微信、银行卡、信用卡……
场景满足同一件事的不同完成方式
故不变一为“支付”,多变为“支付方式”。一变-支付宝、二变-微信、三变-银行卡、四变-信用卡
首先,定义多变核心,万变不离其宗-支付接口IPayService,定义接口中支付方式的方法名payMethod
1 package strategy; 2 3 public interface IPayService{ 4 int payMethod(double moneyCount); 5 }
多变实现
一变:支付宝
1 package strategy; 2 3 public class Alipay implements IPayService{ 4 public Alipay(){ 5 System.out.println("支付方式采用了支付宝"); 6 } 7 @Override 8 public int payMethod(double moneyCount){ 9 return 0; 10 } 11 12 }
二变:微信
1 package strategy; 2 3 public class WeChatpay implements IPayService{ 4 public WeChatpay(){ 5 System.out.println("支付方式采用了微信"); 6 } 7 @Override 8 public int payMethod(double moneyCount){ 9 System.out.println("支付方式采用了微信"); 10 return 1; 11 } 12 13 }
三变:银行卡
1 package strategy; 2 3 public class BankCardpay implements IPayService{ 4 public BankCardpay(){ 5 System.out.println("支付方式采用了银行卡"); 6 } 7 @Override 8 public int payMethod(double moneyCount){ 9 System.out.println("支付方式采用了银行卡"); 10 return 0; 11 } 12 13 }
四变:信用卡
1 package strategy; 2 3 public class Paypalpay implements IPayService{ 4 public Paypalpay(){ 5 System.out.println("支付方式采用了信用卡"); 6 } 7 @Override 8 public int payMethod(double moneyCount){ 9 System.out.println("支付方式采用了信用卡"); 10 return 1; 11 } 12 13 }
不变实现:
1 package strategy; 2 3 public class BuySomething{ 4 private IPayService payService; 5 6 public BuySomething(IPayService payService){ 7 this.payService = payService; 8 } 9 10 public int payMoneyCount(double moneyCount){ 11 return payService.payMethod(moneyCount); 12 } 13 }
现在需要支付
1 package strategy; 2 3 public class Market{ 4 public static void main(String[] args){ 5 6 System.out.println("我选中了一件衬衫,老板,多少钱??"); 7 double shirtPrice = 0; 8 System.out.println("哦~小伙子,衬衫的价格是9磅15便士!"); 9 shirtPrice = 9.15; 10 System.out.println("好的老板!我并没有携带现金,我将采用电子支付!"); 11 BuySomething buyShirt = new BuySomething(new WeChatpay()); 12 if(buyShirt.payMoneyCount(shirtPrice)>0){ 13 System.out.println("支付成功!"); 14 System.out.println("欢迎小伙子下次光临!"); 15 }else{ 16 System.out.println("支付失败!"); 17 System.out.println("哦,亲爱的达瓦里氏!你的钱包余额不足了吗?"); 18 } 19 } 20 }
贴一下运行结果:
结果1:
结果2: