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 设计模式>学习中 设计原则 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起 针对接口编程,而不是针对实现编程 多用组合少用继承 ...
随机推荐
- Golang 通过创建临时结构体实现 struct 内 interface struct 的 json 反序列化
原文链接 背景 type AData struct { A string `json:"a"` } type BData struct { B string `json:" ...
- gin框架中使用jwt
生成解析token 如今有很多将身份验证内置到API中的方法 -JSON Web令牌只是其中之一.JSON Web令牌(JWT)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本 ...
- Tomcat-如何创建动态的web工程及目录介绍
1,IDEA中如何创建动态web工程 (1)创建一个新模块 (2)选择你要创建什么类型的模块 (3)输入模块名,finish完成创建 创建成功如下图: 一般在WEB-INF下建一个lib目录 存放ja ...
- centos vnc配置总结
编辑xstart [root@localhost .vnc]# vim xstartup #!/bin/sh [ -r /etc/sysconfig/i18n ] && . /etc/ ...
- 合宙AIR105使用Keil MDK + DAP-Link 烧录和调试
关于AIR105 AIR105是合宙LuatOS生态下的一款芯片, 1月初上市, 开发板与摄像头一起搭售(赠送). 从配置信息看, 芯片性能相当不错: Cortex-M4F内核, 最高频率204Mhz ...
- Linux 配置 kibana
一.Kibana 是啥? Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索.查看交互存储在Elasticsearch索引中的数据. 二.安装步骤? 1.kibana 是 ...
- 【C++】输入输出
缓冲 C++ 的输入输出均通过缓冲区来实现.缓冲区主要是为了解决速度不匹配的问题. cin 阻塞输入.当输入缓存中无字符时则等待用户输入. 输入缓冲 输入缓冲是一种行缓冲.在输入数据只要没有碰到换行符 ...
- React Transition css动画案例解析
实现React Transition Css动画效果 首先在项目工程中引入react-transition-group: npm install react-transition-group --sa ...
- python--003 数据类型
运算符 in "heilo" in "adfsdfsdfsdfsdfdsfdshellofsdfdsf" "li" in ["l ...
- Spring事物
简介 Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现. Spring事务管理器的接口是org ...