浅谈Java常见设计模式(五)
lgli
共 2718字,需浏览 6分钟
· 2021-04-30
星辰闹成一串 月色笑成一弯
傻傻望了你一晚 怎么看都不觉得烦 爱自己不到一半 心都在你身上 只要能让你快乐 我可以拿一切来换
在SpringMVC三层架构的项目中,已然习惯于前端写一个请求,后端对应有个controller来执行这个请求的模式了,那么今天就先仿制下这个模式。
那么首先,需要有一个统一的入口来收集这些请求,所有需要处理的请求都先要传入到这个入口中,然后这个入口类会根据获取到的请求的类型,分配到对相应的控制器去处理。
这里简化下这个过程,程序接收到一个字符串参数,然后根据这个参数,对应找到自己的处理器
首先定义两个处理器AController、BController实现公共接口Controller
AController、BController
然后是这个Dispatch:
客户端调用:
这里,根据request的请求url,经过Dispatch接收处理,然后分配到对应的处理器中处理。
让我们看下类图:
这里Dispatch,持有多个Controller的实现,然后接收到具体的任务,下发到具体的实现中去,这就是一个简单的委派(Delegate)。
委派模式,其实并非23种设计模式中的一种,但是它的实用性,却体现在很多的框架中,比如我们所以熟知的SpringMVC,其中有个DispatchServlet就是一个委派的较好体现,当web端的请求到达后端,通过DispatchServlet分发给不同的Controler处理。
上述过程,其实还通过另外一种方式来实现---策略,这里根据请求的关键字,调用响应的处理器处理,可以类比的把这些处理器,当做一个一个的策略,相应的,根据关键字,得到响应的策略
下面通过这种方式来实现下这个过程:
首先有一个抽象的Strategy:
然后这里模拟了3种策略,分别是A、B和一个空的策略
还有一个空的策略:
然后这里需要一个统一执行器根据不同的策略来执行请求:
看下测试类:
根据不同的关键字,来选择不同的策略,同时执行响应的策略。
这里,把这种模式称为策略模式:
上述代码,其实可以利用前面说到的一些设计模式,进行一定的优化,比如根据关键字选择什么策略的时候,完全可以使用工厂模式来实现。
那么改造下上述过程,3种策略不变,这里新建一个策略工厂类StrategyFactory:
package com.lgli.behavior.delegatestrategy.v3;
import java.util.HashMap;
import java.util.Map;
/**
*
* 策略工厂
* @author lgli
*/
public class StrategyFactory {
private static final StrategyFactory strategyFactory
= new StrategyFactory();
private static final ControllerStrategy EMPTY_STRATEGY
= new EControllerStrategy();
private StrategyFactory(){}
private static final Map<String,ControllerStrategy> map
= new HashMap<>();
static {
map.put(StrategyKey.A.name(),
new AControllerStrategy());
map.put(StrategyKey.B.name(),
new BControllerStrategy());
map.put(StrategyKey.EMPTY.name(),
new EControllerStrategy());
}
public static StrategyFactory getInstance(){
return strategyFactory;
}
public ControllerStrategy getStrategy(String key){
ControllerStrategy controllerStrategy = map.get(key);
return controllerStrategy == null ?
EMPTY_STRATEGY : controllerStrategy;
}
enum StrategyKey{
A,B,EMPTY
}
}
策略工厂使用饿汉式单例,然后先将所有的策略全部缓存起来
对外提供实例化工厂实例方法getInstance和根据key获取对应的策略方法getStrategy
请求处理器类DealController<委派类>:
package com.lgli.behavior.delegatestrategy.v3;
/**
* @author lgli
*/
public class DealController {
private static final DealController dealController
= new DealController();
private DealController(){}
public static DealController getInstance(){
return dealController;
}
public void deal(String key){
StrategyFactory strategyFactory = StrategyFactory
.getInstance();
ControllerStrategy strategy = strategyFactory
.getStrategy(key);
strategy.deal();
}
}
然后测试类:
这个时候,代码就简单明了许多了。。。。。。也比较好维护些了。
欢迎多多指教
点个赞再走了,谢谢!
评论
豆瓣9.7,这部Java神作第3版重磅上市!
文末赠书Java 程序员们开年就有重磅好消息,《Effective Java 中文版(原书第 3 版)》要上市啦!该书的第1版出版于 2001 年,当时就在业界流传开来,受到广泛赞誉。时至今日,已热销近20年,本书第 3 版已是 Java 程序员的必读神书,被誉为“Java 四大名著之一”,甚至连
编码之外
0
大量 Java 开源项目停更...
点击关注公众号,Java 干货及时推送↓推荐阅读:投了 100 多份简历后…出品 | OSC开源社区(ID:oschina2013)Sonatype 发布了最新的一份《软件供应链状况》报告,深入探讨了如何在充满选择的世界中定义更好的软件,并探讨人工智能 (AI) 对软件开发的深远
Java技术栈
0
Java 神作,必读!
Java 程序员们开年就有重磅好消息,《Effective Java 中文版(原书第 3 版)》要上市啦!该书的第1版出版于 2001 年,当时就在业界流传开来,受到广泛赞誉。时至今日,已热销近20年,本书第 3 版已是 Java 程序员的必读神书,被誉为“Java 四大名著之一”,甚至连 Java
小哈学Java
0
Java与lua互相调用简单教程
来源:网络👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新项目
小哈学Java
0
【送书福利】《Java面试八股文:高频面试题与求职攻略一本通》
先来唠唠最近粉丝面试回来跟我聊天,基本上都提到一个点,在面试过程中八股文占比很高(八股文70%、项目20%、10%算法)除了一些搞算法突出的厂除外。其实现在很多厂八股都是逐渐深入的方式来问,所以大家在学习的过程中,针对一些重点的内容,最好深入去学习,不然还是比较难应对这种追问式的问题。最近刚好从一位
Java后端技术
0
微服务与领域驱动设计,架构实践总结
来源:知了一笑👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新
小哈学Java
0
面试官:电商库存扣减如何设计?如何防止超卖?
来源:my.oschina.net/xiaolyuh/blog/1615639👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示
小哈学Java
0
面试官:限流的常见算法有哪些?
限流的实现算法有很多,但常见的限流算法有三种:计数器算法、漏桶算法和令牌桶算法。1.计数器算法计数器算法是在一定的时间间隔里,记录请求次数,当请求次数超过该时间限制时,就把计数器清零,然后重新计算。当请求次数超过间隔内的最大次数时,拒绝访问。计数器算法的实现比较简单,但存在“突刺现象”。突刺现象是指
Stephen
0