面向对象的两个基本准则:

单一职责:一个类只有一个发生变化的原因

开闭原则:对拓展开放,对修改关闭

《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策略模式拙见的更多相关文章

  1. JAVA策略模式

    <JAVA与模式>之策略模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法 ...

  2. Java策略模式(Strategy模式) 之体验

    <JAVA与模式>之策略模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法 ...

  3. Java策略模式以及来自lambda的优化

    前言    设计模式是软件工程中一些问题的统一解决方案的模型,它的出现是为了解决一些普遍存在的,却不能被语言特性直接解决的问题,随着软件工程的发展,设计模式也会不断的进行更新,本文介绍的是经典设计模式 ...

  4. java策略模式(及与工厂模式的区别)

    按一般教程中出现的例子理解: 简单工厂模式:客户端传一个条件进工厂类,工厂类根据条件创建相应的产品类对象,并return给客户端,供客户端使用.即客户端使用的是工厂类生产的产品对象. 策略模式:客户端 ...

  5. Java策略模式(Strategy)

    一.定义 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换.策略模式使这些算法在客户端调用它们的时候能够互不影响地变化.(Java的TreeSet集合中,构造方法可传入具体的比较器对象以实现 ...

  6. Java 策略模式和状态模式

    本文是转载的,转载地址:大白话解释Strategy模式和State模式的区别 先上图: 本质上讲,策略模式和状态模式做得是同一件事:去耦合.怎么去耦合?就是把干什么(语境类)和怎么干(策略接口)分开, ...

  7. java - 策略模式、状态模式、卫语句,避免多重if-else(转)

    前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...

  8. Java 策略模式(Strategy)

    创建一个能够根据所传递的参数对象的不同而具有不同行为的方法 要执行的算法固定不变,封装到一个类(Context)中 策略就是传递进去的参数对象,它包含执行代码 策略接口 /** * 策略接口 */ p ...

  9. java 策略模式

    <Head First 设计模式>学习中  设计原则 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起 针对接口编程,而不是针对实现编程 多用组合少用继承   ...

随机推荐

  1. Golang 通过创建临时结构体实现 struct 内 interface struct 的 json 反序列化

    原文链接 背景 type AData struct { A string `json:"a"` } type BData struct { B string `json:" ...

  2. gin框架中使用jwt

    生成解析token 如今有很多将身份验证内置到API中的方法 -JSON Web令牌只是其中之一.JSON Web令牌(JWT)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本 ...

  3. Tomcat-如何创建动态的web工程及目录介绍

    1,IDEA中如何创建动态web工程 (1)创建一个新模块 (2)选择你要创建什么类型的模块 (3)输入模块名,finish完成创建 创建成功如下图: 一般在WEB-INF下建一个lib目录 存放ja ...

  4. centos vnc配置总结

    编辑xstart [root@localhost .vnc]# vim xstartup #!/bin/sh [ -r /etc/sysconfig/i18n ] && . /etc/ ...

  5. 合宙AIR105使用Keil MDK + DAP-Link 烧录和调试

    关于AIR105 AIR105是合宙LuatOS生态下的一款芯片, 1月初上市, 开发板与摄像头一起搭售(赠送). 从配置信息看, 芯片性能相当不错: Cortex-M4F内核, 最高频率204Mhz ...

  6. Linux 配置 kibana

    一.Kibana 是啥? Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索.查看交互存储在Elasticsearch索引中的数据. 二.安装步骤? 1.kibana 是 ...

  7. 【C++】输入输出

    缓冲 C++ 的输入输出均通过缓冲区来实现.缓冲区主要是为了解决速度不匹配的问题. cin 阻塞输入.当输入缓存中无字符时则等待用户输入. 输入缓冲 输入缓冲是一种行缓冲.在输入数据只要没有碰到换行符 ...

  8. React Transition css动画案例解析

    实现React Transition Css动画效果 首先在项目工程中引入react-transition-group: npm install react-transition-group --sa ...

  9. python--003 数据类型

    运算符 in "heilo" in "adfsdfsdfsdfsdfdsfdshellofsdfdsf" "li"  in ["l ...

  10. Spring事物

    简介 Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现. Spring事务管理器的接口是org ...