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: