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

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

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

《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. 【刷题-LeetCode】164 Maximum Gap

    Maximum Gap Given an unsorted array, find the maximum difference between the successive elements in ...

  2. opencv 4.0 + linux下静态编译,展示详细ccmake的参数配置

    #先安装 cmake 3.14 # cmake安装到了 /usr/local/bin #配置PATH export PATH="$PATH:/usr/local/bin" #下载最 ...

  3. 原子操作atomic解读

    下面从一个问题引入: // ConsoleApplication5.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include<ran ...

  4. QT之键盘事件

    Widget.h: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QKeyEvent> #incl ...

  5. 一个简单的javaweb项目模板

    Controller包:表现层(视图)层.用来显示数据和接收用户数据 Service包:业务逻辑层,用来处理页面.先写接口,后写实现类 Dao包:持久层(数据访问层).用来操作数据库 其中Dao包处于 ...

  6. yum搭建私有仓库远程版

    目录 一:yum安装 1.简介 1.安装 2.卸载 3.更新 4.yum安装的生命周期 二:yum搭建私有仓库(本地版) 1.下载必须的软件包(准备配置) 2.创建软件仓库 3.下载对应的软件 4.初 ...

  7. 学习Java第3天

    今天所做的工作: 1.循环结构 2.字符串 3.数组 4.面向对象概述 明天工作安排: 1.类和对象 2.包装类 所遇到的问题及解决方法: 1.循环foreach语句 2.字符串初始化与c++的差异 ...

  8. Halcon视觉入门芯片识别

    Halcon视觉入门芯片识别 需求 有如下图的一个摆盘,摆盘的方格中摆放芯片,一个格子中只放一个,我们需要知道每个方格中是否有芯片去指导我们将芯片放到空的方格中. 分析 通过图片分析得出 我们感兴趣的 ...

  9. 鸿蒙轻内核源码分析:文件系统FatFS

    摘要:本文为大家介绍FatFS文件系统结构体的结构体和全局变量,并分析FatFS文件操作接口. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列二一 03 文件系统FatFS>,作者:zh ...

  10. 「CTSC2010」产品销售

    「CTSC2010」产品销售 30pts的费用流都会吧... 100pts只要模拟费用流就行了,是不是很简单呀( 咕咕咕 令\(M_i\)表示\(i-1\to i\)的正向边,\(M_i^{'}\)表 ...