策略模式:

使用常用,支付,之前做了微信支付,支付宝支付,然后另外一个同事写了一个银联支付,那么如果代码方法一起就会导致代码不是很好操作所以,采用策略模式进行,同事只需要写一个实现类,就可以了,

在协作过程中比较容易。

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:将这些算法封装成一个一个的类,任意地替换。

关键代码:实现同一个接口。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

使用案例代码:

策略接口:执行的方法

package com.cxy.ssp.strategy;

public interface Strategy {
String getVpcList(DemoPojo demoPojo);
}

实体类:

package com.cxy.ssp.strategy;

public class DemoPojo {
private String poolid;
private String orderId;
private String name; public String getPoolid() {
return poolid;
} public void setPoolid(String poolid) {
this.poolid = poolid;
} public String getOrderId() {
return orderId;
} public void setOrderId(String orderId) {
this.orderId = orderId;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public DemoPojo(String poolid, String orderId, String name) {
this.poolid = poolid;
this.orderId = orderId;
this.name = name;
} public DemoPojo() { }
}

实现类:

1

package com.cxy.ssp.strategy.impl;

import com.cxy.ssp.strategy.DemoPojo;
import com.cxy.ssp.strategy.Strategy;
import org.springframework.stereotype.Component; @Component("A")
public class SA implements Strategy {
@Override
public String getVpcList(DemoPojo demoPojo) {
System.out.println("A,getVpcList ==========="+demoPojo);
return demoPojo.getName();
}
}

2

package com.cxy.ssp.strategy.impl;

import com.cxy.ssp.strategy.DemoPojo;
import com.cxy.ssp.strategy.Strategy;
import org.springframework.stereotype.Component; @Component("B")
public class SB implements Strategy {
@Override
public String getVpcList(DemoPojo demoPojo) {
System.out.println("b,getVpcList ==========="+demoPojo);
return demoPojo.getName();
}
}

3

package com.cxy.ssp.strategy.impl;

import com.cxy.ssp.strategy.DemoPojo;
import com.cxy.ssp.strategy.Strategy;
import org.springframework.stereotype.Component; @Component("C")
public class SC implements Strategy {
@Override
public String getVpcList(DemoPojo demoPojo) {
System.out.println("c"+demoPojo);
return demoPojo.getName();
}
}

策略context

package com.cxy.ssp.strategy;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; /***、
*通过Spring将实现Strategy的实现类都自动注入到strategyMap类中,
* 当用户传入选择的资源池时,自动根据资源池id去对应的资源池实现中查找资源。
*
*/
@Service
public class SimpleContext {
@Autowired
private final Map<String, Strategy> strategyMap = new ConcurrentHashMap<>(); public SimpleContext(Map<String, Strategy> strategyMap) {
this.strategyMap.clear();
strategyMap.forEach((k, v)-> this.strategyMap.put(k, v));
} public String getResource(DemoPojo demoPojo){
return strategyMap.get(demoPojo.getPoolid()).getVpcList(demoPojo);
}
}

策略服务L:

package com.cxy.ssp.controller;

import com.cxy.ssp.strategy.DemoPojo;
import com.cxy.ssp.strategy.SimpleContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; @RestController
public class TestController {
@Autowired
private SimpleContext simpleContext; @PostMapping("/choose")
public String choose(@RequestBody DemoPojo demoPojo){
return simpleContext.getResource(demoPojo);
}
}

外加一个核心启动类:

package com.cxy.ssp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class SspApplication { public static void main(String[] args) {
SpringApplication.run(SspApplication.class, args);
} }

就已经完成了。思想:将实现类交给spring去管理,通过接口的注入,获取对应的类型,再通过context进行调用执行的方法:

测试:

此时应该有人怀疑:调用了同一个方法,然后输出的都是一个方法。

那么进行修改代码:

package com.cxy.ssp.strategy.impl;

import com.cxy.ssp.strategy.DemoPojo;
import com.cxy.ssp.strategy.Strategy;
import org.springframework.stereotype.Component; @Component("A")
public class SA implements Strategy {
@Override
public String getVpcList(DemoPojo demoPojo) {
System.out.println("A,getVpcList ==========="+demoPojo);
return demoPojo.getName()+"a";
}
}
package com.cxy.ssp.strategy.impl;

import com.cxy.ssp.strategy.DemoPojo;
import com.cxy.ssp.strategy.Strategy;
import org.springframework.stereotype.Component; @Component("B")
public class SB implements Strategy {
@Override
public String getVpcList(DemoPojo demoPojo) {
System.out.println("b,getVpcList ==========="+demoPojo);
return demoPojo.getName()+"b";
}
}
package com.cxy.ssp.strategy.impl;

import com.cxy.ssp.strategy.DemoPojo;
import com.cxy.ssp.strategy.Strategy;
import org.springframework.stereotype.Component; @Component("C")
public class SC implements Strategy {
@Override
public String getVpcList(DemoPojo demoPojo) {
System.out.println("c"+demoPojo);
return demoPojo.getName()+"c";
}
}

就测试到这里,那么如果传输的那个poolid传输错误了改怎么处理呢:

服务器端报错误:说明没有这个方法,

那么可以在context中进行限制:

首先判断是否包含,如果不包含,就可以直接threw一个异常,让前台直接显示

springboot项目中使用设计模式一策略模式的更多相关文章

  1. JavaScript中的设计模式:策略模式

    无论学习前端还是后端设计模式是作为一名程序员不可缺少的知识,就像下底传中对于一个边锋来说. 一.策略模式 策略模式给人的第一感觉就是在代码里面消除了很多if-else分支语句,比如一个求员工奖金的程序 ...

  2. 23中java设计模式(1)-- 策略模式

    近来不太忙,就打算抽空看下源码补充一下知识,当我看了之后我发现看源码的关键是要弄清楚类之家的关系以及为何要这样的关系,否则如果只看具体的代码那不如去学习会儿算法. 于是就打算从设计模式入手,边学习边记 ...

  3. 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查

    原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...

  4. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...

  5. 设计模式:策略模式,Java集合定制排序的核心思想

    前言 前阵子面试的时候,有个面试官问我了解哪些设计模式吗?我说了策略模式.接着他问有哪些场景应用,我又回答他jdk的集合工具类有个排序方法就用到了策略模式,也就是java.util包下的Collect ...

  6. python设计模式之策略模式

    每次看到项目中存在大量的if else代码时,都会心生一丝不安全感. 特别是产品给的需求需要添加或者更改一种if条件时,生怕会因为自己的疏忽而使代码天崩地裂,哈哈,本文的目的就是来解决这种不安全感的, ...

  7. PHP设计模式之策略模式

    前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...

  8. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  9. JavaScript设计模式之策略模式

    所谓"条条道路通罗马",在现实中,为达到某种目的往往不是只有一种方法.比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷.抢.赌等等各种手段.在程序语言设计中,也会遇到这种类 ...

随机推荐

  1. 4种XML解析器

    <?xml version="1.0" encoding="UTF-8"?> <Result> <VALUE> <NO ...

  2. 关于类中的参数类型和return返回值

    基础有些忘了,现在重新巩固一下 先定义一个Person类 class Person(): def __init__(self,name,age,height): self.name=name, sel ...

  3. python sort 和sorted排序

    当我们从数据库中获取一写数据后,一般对于列表的排序是经常会遇到的问题,今天总结一下python对于列表list排序的常用方法: 第一种:内建方法sort() 可以直接对列表进行排序 用法: list. ...

  4. mysql优化1:建表原则

    建表三大原则: 定长和变长分离 常用字段和不常用字段分离 使用冗余字段或冗余表 1.定长与变长分离 如 id int,占4个字节,char(4)占4个字符长度,也是定长,time 即每一个单元值占的字 ...

  5. 前端(七)—— 盒模型之display、overflow、隐藏、border、margin、样式支持,层级结构

    display.overflow.隐藏.border.margin.样式支持,层级结构 一.盒模型之display 1.三种样式 block 块 inline 内联/行内 inline-block 内 ...

  6. Unity中对注册表进行修改

    问题背景: PC端软件开发,当我在Unity中的PlayerSetting中设置好分辨率,每次打包运行后会记忆上次退出时窗口的分辨率(记忆窗口状态),导致下次打开时不是PlayerSetting中的初 ...

  7. 装箱与拆箱(TDB)

    装箱:把值类型转换为引用类型 拆箱:把引用类型转换为值类型 只能对之前装箱的变量进行拆箱.需要强制转换.

  8. python代码技巧总结(更新至17条)

    怎么提高代码水平?答:看牛逼的代码! 牛逼的代码怎么写的?简单,明确,优雅! 怎么简单,明确,优雅?学技巧! 下面搜罗了一些有才格子褂青年的总结,哈哈 1.检查 Python 中的对象 调用 dir( ...

  9. PDO如何完成事务操作

    起因 无意间翻看极客学院的APP,准备找一些教程看看.看到一篇PDO 安全处理与事务处理,一想对MySQL的事务处理仅仅停留在概念上(知道执行多条语句,其中一个失败了,就会回滚操作).但是把概念变成代 ...

  10. 2018-8-10-C#-配置文件存储-各种序列化算法性能比较

    title author date CreateTime categories C# 配置文件存储 各种序列化算法性能比较 lindexi 2018-08-10 19:16:52 +0800 2018 ...