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

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

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

《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. Choregraphe 2.8.6.23虚拟Nao机器人Socket is not connected

    Traceback (most recent call last): File "c:/Users/fengmao/OneDrive - University of Wollongong/J ...

  2. 🏆【Alibaba中间件技术系列】「Nacos技术专题」配置中心加载原理和配置实时更新原理分析(上)

    官方资源 https://nacos.io/zh-cn/docs/quick-start.html Nacos之配置中心 动态配置管理是 Nacos的三大功能之一,通过动态配置服务,可以在所有环境中以 ...

  3. python文档1-unittest单元测试之mock

    什么是mock unittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西.它的主要功能是使用mock对象替代掉指定的 ...

  4. 集合框架-Map集合重点方法keySet演示

    1 package cn.itcast.p6.map.demo; 2 3 import java.util.HashMap; 4 import java.util.Iterator; 5 import ...

  5. Android开发-资源导入

    安卓开发首先要导入开发资源,这些资源包括图片,图标等,方便开发过程中的使用 我是跟着b站博主做的记账本app所以导入的资源也来自于网络 将资源导入到res文件夹下这里面包括颜色资源,布局资源,图片资源 ...

  6. 微服务架构 | 5.4 Sentinel 流控、统计和熔断的源码分析

    目录 前言 1. Sentinel 的自动装配 1.2 依赖引入 1.3 SentinelWebAutoConfiguration 配置类 1.4 CommonFilter 过滤器 1.5 小结 2. ...

  7. ql/sql 循环语句、异常处理、事务处理!

    一.ql sql 循环语句? /*1.loop循环 语法: 声明循环变量 loop 判断循环条件 ,如果循环条件不成立,跳出循if 条件表达式 then exit; end if; 语句块; 改变循环 ...

  8. 分布式缓存系统——memcache

    一.简介 memcache是一个自由开源的.高性能的.分布式内存对象缓存系统.它是一种基于内存的key-value存储,用来存储小块的任意数据(字符串.对象).这些数据可以是数据库调用.API调用等. ...

  9. homestead 入坑安装

    1.在使用 Homestead 之前,需要先安装 Virtual Box.VMWare.Parallels 或 Hyper-V (四选一,我们通常选择 VirtualBox,因为只有它是免费的)以及  ...

  10. Fastjson的JSONObject.toJSON()解析复杂对象发生内存泄漏问题

    这可能是fastjson的一个bug,我使用最新版依然存在该问题. 在用做报表功能的时候,发现一旦单元格过多,大概有80-100个单元格,就会发生程序假死,CPU持续占用超过90%,内存持续占用超90 ...