java策略模式拙见

面向对象的两个基本准则:
单一职责:一个类只有一个发生变化的原因
开闭原则:对拓展开放,对修改关闭
《Java开发手册》中,有这样的规则:超过3层的 if-else 的逻辑判断代码可以使用卫语句、策略模式、状态模式等来实现。
在代码中纵使采用if/else也可以达到要求,但是如果过度采用这种方式会导致代码极为复杂,后期维护及拓展相当困难。因此策略模式可以用来解决这种困扰
问:怎么使用策略模式
首先明白,什么是策略模式
:通过分割使用算法、实现算法主体进而拆除复杂繁琐的if/else方法体的一种编程思想
策略模式的优点
1、降低了多重条件语句伴随的维护难度高的问题
2、恰当的使用了继承,减少了冗余代码
3、贴合开闭原则,保证尽可能少对原代码更改的前提新增了功能
策略模式的缺点
:随着策略的不断增多会导致策略类数量庞大(可通过混合模式解决)
实现的方式
1、定义公有策略接口IStrategyService及策略方法doOperation(Object arg)
2、根据需要采用的策略,实现策略接口,定义策略实现类StrategyServiceImpl
3、使用策略实现类
java策略模式拙见
文章图片

1 public class Context { 2private Strategy strategy; 3 4public Context(Strategy strategy){ 5this.strategy = strategy; 6} 7 8public int executeStrategy(int num1, int num2){ 9return strategy.doOperation(num1, num2); 10} 11 }

java策略模式拙见
文章图片

java策略模式拙见
文章图片
1 public class StrategyPatternDemo { 2public static void main(String[] args) { 3Context context = new Context(new OperationAdd()); 4System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); 5 6context = new Context(new OperationSubtract()); 7System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); 8 9context = new Context(new OperationMultiply()); 10System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); 11} 12 }

java策略模式拙见
文章图片


现在,尝试自己使用策略模式
使用场景,支付
支付方式可以有多种,包括支付宝、微信、银行卡、信用卡......
场景满足同一件事的不同完成方式
故不变一为“支付”,多变为“支付方式”。一变-支付宝、二变-微信、三变-银行卡、四变-信用卡
首先,定义多变核心,万变不离其宗-支付接口IPayService,定义接口中支付方式的方法名payMethod
1 package strategy; 2 3 public interface IPayService{ 4int payMethod(double moneyCount); 5 }


多变实现
一变:支付宝
java策略模式拙见
文章图片
1 package strategy; 2 3 public class Alipay implements IPayService{ 4public Alipay(){ 5System.out.println("支付方式采用了支付宝"); 6} 7@Override 8public int payMethod(double moneyCount){ 9return 0; 10} 11 12 }

java策略模式拙见
文章图片

二变:微信
java策略模式拙见
文章图片
1 package strategy; 2 3 public class WeChatpay implements IPayService{ 4public WeChatpay(){ 5System.out.println("支付方式采用了微信"); 6} 7@Override 8public int payMethod(double moneyCount){ 9System.out.println("支付方式采用了微信"); 10return 1; 11} 12 13 }

java策略模式拙见
文章图片

三变:银行卡
java策略模式拙见
文章图片
1 package strategy; 2 3 public class BankCardpay implements IPayService{ 4public BankCardpay(){ 5System.out.println("支付方式采用了银行卡"); 6} 7@Override 8public int payMethod(double moneyCount){ 9System.out.println("支付方式采用了银行卡"); 10return 0; 11} 12 13 }

java策略模式拙见
文章图片

四变:信用卡
java策略模式拙见
文章图片
1 package strategy; 2 3 public class Paypalpay implements IPayService{ 4public Paypalpay(){ 5System.out.println("支付方式采用了信用卡"); 6} 7@Override 8public int payMethod(double moneyCount){ 9System.out.println("支付方式采用了信用卡"); 10return 1; 11} 12 13 }

java策略模式拙见
文章图片

不变实现:
java策略模式拙见
文章图片
1 package strategy; 2 3 public class BuySomething{ 4private IPayService payService; 5 6public BuySomething(IPayService payService){ 7this.payService = payService; 8} 9 10public int payMoneyCount(double moneyCount){ 11return payService.payMethod(moneyCount); 12} 13 }

java策略模式拙见
文章图片

现在需要支付
java策略模式拙见
文章图片
1 package strategy; 2 3 public class Market{ 4public static void main(String[] args){ 5 6System.out.println("我选中了一件衬衫,老板,多少钱??"); 7double shirtPrice = 0; 8System.out.println("哦~小伙子,衬衫的价格是9磅15便士!"); 9shirtPrice = 9.15; 10System.out.println("好的老板!我并没有携带现金,我将采用电子支付!"); 11BuySomething buyShirt = new BuySomething(new WeChatpay()); 12if(buyShirt.payMoneyCount(shirtPrice)>0){ 13System.out.println("支付成功!"); 14System.out.println("欢迎小伙子下次光临!"); 15}else{ 16System.out.println("支付失败!"); 17System.out.println("哦,亲爱的达瓦里氏!你的钱包余额不足了吗?"); 18} 19} 20 }

java策略模式拙见
文章图片
贴一下运行结果:
结果1:
java策略模式拙见
文章图片



结果2:
java策略模式拙见
文章图片

【java策略模式拙见】

    推荐阅读