成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試的時(shí)候別再說(shuō)你不會(huì)設(shè)計(jì)模式了

開(kāi)發(fā) 前端
設(shè)計(jì)模式往往是對(duì)某些共性能力的抽象,但也沒(méi)有一個(gè)設(shè)計(jì)模式可以適用于所有的場(chǎng)景;需要對(duì)不同的需求選擇不同的設(shè)計(jì)模式。

圖片

前言

最近不出意外的陽(yáng)了,加上剛?cè)肼毿鹿静痪茫砸矝](méi)怎么更新;這兩天好些后分享一篇前段時(shí)間的一個(gè)案例:

最近在設(shè)計(jì)一個(gè)對(duì)某個(gè)中間件的測(cè)試方案,這個(gè)測(cè)試方案需要包含不同的測(cè)試邏輯,但相同的是需要對(duì)各個(gè)環(huán)節(jié)進(jìn)行記錄;比如統(tǒng)計(jì)耗時(shí)、調(diào)用通知 API 等相同的邏輯。

如果每個(gè)測(cè)試都單獨(dú)寫(xiě)這些邏輯那無(wú)疑是做了許多重復(fù)工作了。

基于以上的特征很容易能想到模板方法這個(gè)設(shè)計(jì)模式。

這是一種有上層定義框架,下層提供不同實(shí)現(xiàn)的設(shè)計(jì)模式。

比如裝修房子的時(shí)候業(yè)主可以按照自己的喜好對(duì)不同的房間進(jìn)行裝修,但是整體的戶型圖不能做修改,比如承重墻是肯定不能打的。

而這些固定好的條條框框就是上層框架給的約束,下層不同的實(shí)現(xiàn)就有業(yè)主自己決定;所以對(duì)于整棟樓來(lái)說(shuō)框架都是固定好的,讓業(yè)主在有限的范圍內(nèi)自由發(fā)揮也方便物業(yè)的管理。

具體實(shí)現(xiàn)

以我這個(gè)案例的背景為例,首先需要定義出上層框架:

Java

Event 接口:

public interface Event {

/**
* 新增一個(gè)任務(wù)
*/
void addJob();

/**
* 單個(gè)任務(wù)執(zhí)行完畢
*
* @param jobName 任務(wù)名稱(chēng)
* @param finishCost 任務(wù)完成耗時(shí)
*/
void finishOne(String jobName, String finishCost);

/**單個(gè)任務(wù)執(zhí)行異常
* @param jobDefine 任務(wù)
* @param e 異常
*/
void oneException(AbstractJobDefine jobDefine, Exception e);

/**
* 所有任務(wù)執(zhí)行完畢
*/
void finishAll();
}
public void start(){
event.addJob();
try {
CompletableFuture.runAsync(() -> {
StopWatch watch = new StopWatch();
try {
watch.start(jobName);
// 不同的子業(yè)務(wù)實(shí)現(xiàn)
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 函數(shù),它是一個(gè)抽象函數(shù),具體實(shí)現(xiàn)交由子類(lèi)完成;這樣不同的測(cè)試用例之間也互不干擾,同時(shí)整體的流程完全相同:

  • 記錄任務(wù)數(shù)量
  • 統(tǒng)計(jì)耗時(shí)
  • 異常記錄

等流程。

接下來(lái)看看如何使用:

        AbstractJobDefine job1 = new Test1(event, "測(cè)試1", client, 10);
CompletableFuture<Void> c1 = CompletableFuture.runAsync(job1::start, EXECUTOR);

AbstractJobDefine job2 = new Test2(event, "測(cè)試2", client, 10);
CompletableFuture<Void> c2 = CompletableFuture.runAsync(job2::start, EXECUTOR);

AbstractJobDefine job3 = new Test3(event, "測(cè)試3", client, 20);
CompletableFuture<Void> c3 = CompletableFuture.runAsync(job3::start, EXECUTOR);

CompletableFuture<Void> all = CompletableFuture.allOf(c1, c2, c3);
all.whenComplete((___, __) -> {
event.finishAll();
client.close();
}).get();

顯而易見(jiàn) Test1~3 都繼承了 AbstractJobDefine 同時(shí)實(shí)現(xiàn)了其中的 run 函數(shù),使用的時(shí)候只需要?jiǎng)?chuàng)建不同的實(shí)例等待他們都執(zhí)行完成即可。

以前在 Java 中也有不同的應(yīng)用:

?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 自然也可以實(shí)現(xiàn):

圖片

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
}

使用起來(lái)也與 Java 類(lèi)似,創(chuàng)建不同的實(shí)例;最后等待所有的任務(wù)執(zhí)行完畢。

總結(jié)

設(shè)計(jì)模式往往是對(duì)某些共性能力的抽象,但也沒(méi)有一個(gè)設(shè)計(jì)模式可以適用于所有的場(chǎng)景;需要對(duì)不同的需求選擇不同的設(shè)計(jì)模式。

至于在工作中如何進(jìn)行正確的選擇,那就需要自己日常的積累了;比如多去了解不同的設(shè)計(jì)模式對(duì)于的場(chǎng)景,或者多去閱讀優(yōu)秀的代碼,Java 中的 InputStream/Reader/Writer 這類(lèi) IO 相關(guān)的類(lèi)都有具體的應(yīng)用。

責(zé)任編輯:姜華 來(lái)源: crossoverJie
相關(guān)推薦

2020-01-15 08:52:40

RabbitMQSpringMybatis

2020-11-09 07:34:49

JVM性能監(jiān)控

2023-01-05 17:55:39

分布式架構(gòu)

2020-12-18 09:45:33

DockerLinux命令

2022-05-27 21:56:55

索引存儲(chǔ)MySQL 存儲(chǔ)引擎

2021-02-24 07:38:50

Redis

2022-08-12 15:58:34

Docker

2021-06-16 00:57:16

JVM加載機(jī)制

2022-06-18 23:03:05

Seata分布式事務(wù)

2022-03-11 12:31:04

Vue3組件前端

2020-06-18 10:48:44

Linux 系統(tǒng) 數(shù)據(jù)

2017-08-09 15:07:08

大數(shù)據(jù)數(shù)據(jù)分析戶畫(huà)像

2018-09-28 05:25:53

TopK算法代碼

2018-11-01 13:49:23

桶排序排序面試

2018-10-28 22:37:00

計(jì)數(shù)排序排序面試

2016-01-20 11:27:45

云計(jì)算虛擬化存儲(chǔ)

2024-12-09 06:00:00

單例模式代碼

2021-05-17 14:57:23

策略模式代碼

2020-06-01 20:48:36

內(nèi)存面試者流量

2025-03-26 02:00:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品福利网站 | 久久久不卡网国产精品一区 | 久久久国产一区二区三区 | 日本中文字幕一区 | 国产精品爱久久久久久久 | 欧美色专区 | 亚洲看片网站 | yiren22 亚洲综合| 草久久 | 在线观看av不卡 | 久草中文在线 | 国产精品一区二区久久 | 一级片免费视频 | 日韩一区二区三区av | 欧美一区二区三区视频在线播放 | 区一区二区三在线观看 | 国产高清视频 | 日韩电影免费在线观看中文字幕 | 久久国产精品视频观看 | 激情久久网 | 欧美激情在线精品一区二区三区 | 久久夜视频 | 自拍偷拍在线视频 | 国内精品视频免费观看 | 91久久精品| 综合精品久久久 | 高清亚洲| 日韩欧美一区二区在线播放 | 在线看91| 福利国产| 久久久蜜臀国产一区二区 | 日韩和的一区二区 | 国产精品一区二区在线播放 | 日韩一区二区三区在线 | 日日爱视频 | 色婷婷久久 | 久久久久国产一区二区三区四区 | 四虎成人免费视频 | 日韩网站在线观看 | 亚洲视频中文 | 欧美区在线|