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策略模式拙见的更多相关文章
- JAVA策略模式
<JAVA与模式>之策略模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法 ...
- Java策略模式(Strategy模式) 之体验
<JAVA与模式>之策略模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法 ...
- Java策略模式以及来自lambda的优化
前言 设计模式是软件工程中一些问题的统一解决方案的模型,它的出现是为了解决一些普遍存在的,却不能被语言特性直接解决的问题,随着软件工程的发展,设计模式也会不断的进行更新,本文介绍的是经典设计模式 ...
- java策略模式(及与工厂模式的区别)
按一般教程中出现的例子理解: 简单工厂模式:客户端传一个条件进工厂类,工厂类根据条件创建相应的产品类对象,并return给客户端,供客户端使用.即客户端使用的是工厂类生产的产品对象. 策略模式:客户端 ...
- Java策略模式(Strategy)
一.定义 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换.策略模式使这些算法在客户端调用它们的时候能够互不影响地变化.(Java的TreeSet集合中,构造方法可传入具体的比较器对象以实现 ...
- Java 策略模式和状态模式
本文是转载的,转载地址:大白话解释Strategy模式和State模式的区别 先上图: 本质上讲,策略模式和状态模式做得是同一件事:去耦合.怎么去耦合?就是把干什么(语境类)和怎么干(策略接口)分开, ...
- java - 策略模式、状态模式、卫语句,避免多重if-else(转)
前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...
- Java 策略模式(Strategy)
创建一个能够根据所传递的参数对象的不同而具有不同行为的方法 要执行的算法固定不变,封装到一个类(Context)中 策略就是传递进去的参数对象,它包含执行代码 策略接口 /** * 策略接口 */ p ...
- java 策略模式
<Head First 设计模式>学习中 设计原则 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起 针对接口编程,而不是针对实现编程 多用组合少用继承 ...
随机推荐
- Cesium源码剖析---视频投影
Cesium中的视频投影是指将视频作为一种物体材质,实现在物体上播放视频的效果.这个功能在Cesium早期版本中就支持了,在Code Example中有一个示例.今天就来分析一下其内部实现原理. 1. ...
- Windows和Linux(Centos7)下安装Nginx
安装Nginx 这篇记录只不过做了一个简单总结,如果对这块没什么概念的话可以看一下知乎的这篇文章 https://zhuanlan.zhihu.com/p/83890573 window下安装 win ...
- MySql服务器逻辑架构
一.MySql服务器逻辑架构图 每个虚线框都是一层: 第一层:最上层的服务器不是MySql所独有的,大多数基于网络的客户端/服务器工具或者服务都有类似的系统.比如链接处理,授权认证,安 ...
- 论文解读GALA《Symmetric Graph Convolutional Autoencoder for Unsupervised Graph Representation Learning》
论文信息 Title:<Symmetric Graph Convolutional Autoencoder for Unsupervised Graph Representation Learn ...
- python if-elif-else 判断
#!/usr/bin/python #coding=utf-8 #好好学习,天天向上 age=12 if age<4: price=0 elif age<18: price=40 elif ...
- STS中创建 javaweb 项目?
package com.aaa.readme; /* * 一. * 1.安装Tomcat 版本8.5 * * 2.file---->new------>dynamic java web p ...
- ApacheCN 人工智能知识树 v1.0
贡献者:飞龙 版本:v1.0 最近总是有人问我,把 ApacheCN 这些资料看完一遍要用多长时间,如果你一本书一本书看的话,的确要用很长时间.但我觉得这是非常麻烦的,因为每本书的内容大部分是重复的, ...
- CF 1394 简要题解
最近都会做一些 \(\rm Div1\) 套题中 \(3000\) 分以下的题目. A 直接枚举贪心即可. B 首先不难发现总共可能的 \(c\) 序列只有 \(k!\) 种,很明显要暴力枚举所有情况 ...
- shiro和redis集成,前后端分离
前言 框架:springboot+shiro+redis+vue 最近写前后端分离授权的对账平台系统,采取了shiro框架,若采用shiro默认的cookie进行授权验证时,一直存在由于跨域造成前端请 ...
- nginx开发:ngx_sprintf
格式化参数%系列,如果误用的话,轻则输出不正确,重则nginx可能core. 1. 格式: %{格式描述}{输出类型描述}{数据类型描述} 2. 数据类型描述: V:字符串,对应ngx_str_t * ...