面试的时候别再说你不会设计模式了
前言
最近在设计一个对某个中间件的测试方案,这个测试方案需要包含不同的测试逻辑,但相同的是需要对各个环节进行记录;比如统计耗时、调用通知 API 等相同的逻辑。
如果每个测试都单独写这些逻辑那无疑是做了许多重复工作了。
基于以上的特征很容易能想到 模板方法 这个设计模式。
这是一种有上层定义框架,下层提供不同实现的设计模式。
比如装修房子的时候业主可以按照自己的喜好对不同的房间进行装修,但是整体的户型图不能做修改,比如承重墙是肯定不能打的。
而这些固定好的条条框框就是上层框架给的约束,下层不同的实现就有业主自己决定;所以对于整栋楼来说框架都是固定好的,让业主在有限的范围内自由发挥也方便物业的管理。 具体实现
以我这个案例的背景为例,首先需要定义出上层框架: Java
Event 接口:public interface Event { /** * 新增一个任务 */ void addJob(); /** * 单个任务执行完毕 * * @param jobName 任务名称 * @param finishCost 任务完成耗时 */ void finishOne(String jobName, String finishCost); /**单个任务执行异常 * @param jobDefine 任务 * @param e 异常 */ void oneException(AbstractJobDefine jobDefine, Exception e); /** * 所有任务执行完毕 */ void finishAll(); } public void start() { event.addJob(); try { CompletableFuture.runAsync(() -> { StopWatch watch = new StopWatch(); try { watch.start(jobName); // 不同的子业务实现 run(client); } catch (Exception e) { event.oneException(this, e); } finally { watch.stop(); event.finishOne(jobName, StrUtil.format("cost: {}s", watch.getTotalTimeSeconds())); } }, TestCase.EXECUTOR).get(timeout, TimeUnit.SECONDS); } catch (Exception e) { event.oneException(this, e); } } /** Run busy code * @param client * @throws Exception e */ public abstract void run(Client client) throws Exception;
其中最核心的就是 run 函数,它是一个抽象函数,具体实现交由子类完成;这样不同的测试用例之间也互不干扰,同时整体的流程完全相同: 记录任务数量 统计耗时 异常记录
等流程。
接下来看看如何使用: AbstractJobDefine job1 = new Test1(event, "测试1", client, 10); CompletableFuture c1 = CompletableFuture.runAsync(job1::start, EXECUTOR); AbstractJobDefine job2 = new Test2(event, "测试2", client, 10); CompletableFuture c2 = CompletableFuture.runAsync(job2::start, EXECUTOR); AbstractJobDefine job3 = new Test3(event, "测试3", client, 20); CompletableFuture c3 = CompletableFuture.runAsync(job3::start, EXECUTOR); CompletableFuture all = CompletableFuture.allOf(c1, c2, c3); all.whenComplete((___, __) -> { event.finishAll(); client.close(); }).get();
显而易见 Test1~3 都继承了 AbstractJobDefine 同时实现了其中的 run 函数,使用的时候只需要创建不同的实例等待他们都执行完成即可。
以前在 Java 中也有不同的应用:
https://crossoverjie.top/2019/03/01/algorithm/consistent-hash/?highlight=%E6%A8%A1%E6%9D%BF%E6%96%B9%E6%B3%95#%E6%A8%A1%E6%9D%BF%E6%96%B9%E6%B3%95 Go
同样的示例用 Go 自然也可以实现:
func TestJobDefine_start(t *testing.T) { event := NewEvent() j1 := &JobDefine{ Event: event, Run: &run1{}, JobName: "job1", Param1: "p1", Param2: "p2", } j2 := &JobDefine{ Event: event, Run: &run2{}, JobName: "job2", Param1: "p11", Param2: "p22", } j1.Start() j2.Start() for _, ch := range event.GetChan() { <-ch } log.Println("finish all") } func (r *run2) Run(param1, param2 string) error { log.Printf("run3 param1:%s, param2:%s", param1, param2) time.Sleep(time.Second * 3) return errors.New("test err") } func (r *run1) Run(param1, param2 string) error { log.Printf("run1 param1:%s, param2:%s", param1, param2) return nil }
使用起来也与 Java 类似,创建不同的实例;最后等待所有的任务执行完毕。 总结
设计模式往往是对某些共性能力的抽象,但也没有一个设计模式可以适用于所有的场景;需要对不同的需求选择不同的设计模式。
至于在工作中如何进行正确的选择,那就需要自己日常的积累了;比如多去了解不同的设计模式对于的场景,或者多去阅读优秀的代码,Java 中的 InputStream/Reader/Writer 这类 IO 相关的类都有具体的应用。
我科学家探索鸟类头骨演化奥秘现生鸟类虽然没有手,但具有极其灵敏的喙,能够取代手完成大量精细的动作。研究认为,这是由于现生鸟类具有头骨可动性其头部的部分骨骼能够发生相互独立的运动。但是鸟类的始祖恐龙并不具备这样
隐者考古2022不得不知的10大发现2022年10大惊人发现在澳大利亚发现古代雨林化石2022年1月,澳大利亚东南部发现的古代雨林的痕迹。在麦格拉斯公寓的1600万至1100万年前的化石在世界上非常罕见,可以确认中新
被狂野的极低频吓到了!酷爱低音的毛毛虫原创文赖英智新音响NewAudiophile20221209酷爱低音的毛毛虫把李凯研称为毛毛虫实在不太礼貌,这是他小孩帮忙取的名字,结果毛毛虫在几个音响群中经常露脸,反而大家都不知
头条十年,精彩无限,快乐永远2022生机大会我们这十年我是2015年下半年入驻今日头条的。头条十年,我伴随了它七年多,至今还在上面撒着欢,幸福着,快乐着。最初认识今日头条,缘于一个在广州打拼的广西年轻人。记得
迅游主机加速盒(旗舰版)测评顶流游戏体验,好看又好用前不久,使命召唤战区2。0已经正式上线了,如果要我给这款游戏打分,我应该会打满分。相比于PUBG他的节奏更快打击感更强,相比于自家前作战区1。0,2。0的游戏内容变得更丰富画面更好
好看的眉毛要靠眉弓撑起来,玻尿酸丰眉弓,立体感马上有很多求美者会关注自己的眉毛是否好看,但很少有人会注意到眉弓对眉毛甚至对整个面部的美观也会有所影响,即使是你拥有了好看的眉毛,也需要靠眉弓撑起来才会更具有美感。眉弓是面部的重要组成部
杜锋儿子太幸福!2位体坛名帅给揉背踩腿,定居北京父子聚少离多近日,马晨菲更新了社交平台,晒出了非常温馨的一幕,杜锋的儿子虎头结束训练之后,外公马文广和外婆姚颖帮助虎头放松身体,其中姚颖跪在地上帮助外孙揉背,马文广则站着帮助外孙踩腿放松。能够
达利的胡子能喷雾!联泰科技与北京工业大学合作再现艺术创意十分感谢松江企业上海联泰科技股份有限公司给予我们的技术支持,让我们的作品如此完美。前不久,在与联泰科技合作完成西班牙著名画家达利的上半身人像的创作后,北京工业大学张飞打印工作室相关
实盘周记20221210,今年收益8,2020年至今总收益9经历了这一个多月的股市,应该能感受到市场情绪有多癫狂了。在我10月28日实盘周记中,实盘组合下跌超过50。过了40天实盘组合已上涨82,一个月的时间,企业还是那些企业,基本面会有如
如何防止脱发?如何防止脱发?每天掉多少头发才算正常?如果你也经常出现这种情况,可以试试下面几种方法。首先,在洗头时,最好使用梳子梳头发,有利于促进头皮血液的流通。其次,不要经常使用吹风机。一不要
哺乳期干货!开奶追奶堵奶一次说清楚母乳喂养不止对宝宝好且对妈妈自身恢复也大有好处都说妈妈伟大,不只是宫开十指的痛产后第二三天的生理性涨奶堵奶追奶才是最难的追奶多辛苦堵奶就有多难受所以今天这些过来人的经验开奶追奶堵奶