java策略模式拙见

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:

  

以上是 java策略模式拙见 的全部内容, 来源链接: utcz.com/z/393159.html

回到顶部