摘要:能夠整體地替換算法,能讓我們輕松地以不同的算法去解決一個(gè)問(wèn)題,這種模式就是模式。這個(gè)類(lèi)是在發(fā)布前常在中被使用的一個(gè)類(lèi),代碼如下以為例,從語(yǔ)義上來(lái)說(shuō)就是為了中的每個(gè)元素調(diào)用函數(shù)。
本文首發(fā)于泊浮目的專(zhuān)欄:https://segmentfault.com/blog...前言
無(wú)論什么程序,其目的都是解決問(wèn)題。而為了解決問(wèn)題,我們又需要編寫(xiě)特定的算法。使用Strategy模式可以整體地替換算法的實(shí)現(xiàn)部分。能夠整體地替換算法,能讓我們輕松地以不同的算法去解決一個(gè)問(wèn)題,這種模式就是Strategy模式。
在ZStack中,Strategy模式幾乎是充斥在80%以上的代碼中的,接下來(lái)我們就來(lái)一起看看吧。
CollectionUtilsCollectionUtils 這個(gè)類(lèi)是在JDK8發(fā)布前常在ZStack中被使用的一個(gè)類(lèi),代碼如下:
package org.zstack.utils; import org.zstack.utils.function.ForEachFunction; import org.zstack.utils.function.Function; import org.zstack.utils.function.ListFunction; import org.zstack.utils.logging.CLogger; import java.util.*; /** */ public class CollectionUtils { private static final CLogger logger = Utils.getLogger(CollectionUtils.class); public staticList transformToList(Collection from, ListFunction func) { List ret = new ArrayList (); for (V v : from) { List k = func.call(v); if (k == null) { continue; } ret.addAll(k); } return ret; } public static List transformToList(Collection from, Function func) { List ret = new ArrayList (); for (V v : from) { K k = func.call(v); if (k == null) { continue; } ret.add(k); } return ret; } public static Set transformToSet(Collection from, Function func) { Set ret = new HashSet (); for (V v : from) { K k = func.call(v); if (k == null) { continue; } ret.add(k); } return ret; } public static Set transformToSet(Collection from, ListFunction func) { Set ret = new HashSet (); for (V v : from) { List k = func.call(v); if (k == null) { continue; } ret.addAll(k); } return ret; } public static K find(Collection from, Function func) { for (V v : from) { K k = func.call(v); if (k != null) { return k; } } return null; } public static void forEach(Collection cols, ForEachFunction func) { for (K c : cols) { func.run(c); } } public static void safeForEach(Collection cols, ForEachFunction func) { for (K c : cols) { try { func.run(c); } catch (Throwable t) { logger.warn(String.format("unhandled exception happened"), t); } } } public static List removeDuplicateFromList(List lst) { return new ArrayList (new LinkedHashSet (lst)); } }
以 public static
Listmsgs = CollectionUtils.transformToList(hostUuids, new Function () { @Override public KVMHostAsyncHttpCallMsg call(String huuid) { ScanCmd cmd = new ScanCmd(); cmd.ip = getIpForScan(struct); cmd.startPort = 1; cmd.endPort = 65535; cmd.interval = struct.getInterval(); cmd.times = struct.getMaxTimes(); cmd.successInterval = struct.getSuccessInterval(); cmd.successTimes = struct.getSuccessTimes(); KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); msg.setHostUuid(huuid); msg.setPath(SCAN_HOST_PATH); msg.setCommandTimeout(timeoutManager.getTimeout(cmd.getClass(), TimeUnit.SECONDS.toMillis(cmd.interval *cmd.times) + TimeUnit.MINUTES.toMillis(1))); msg.setCommand(cmd); bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, huuid); return msg; } });
從這邊的代碼可以看到,通過(guò)遍歷hostUuids并做了一些操作,成功的組成了一組msg。
Completion在異步系統(tǒng)中,Completion是很常見(jiàn)的——當(dāng)一個(gè)異步行為完成時(shí),則會(huì)調(diào)用其相應(yīng)的CompletionHandle。
bus.send(amsg, new CloudBusCallBack(completion) { @Override public void run(MessageReply re) { if (!re.isSuccess()) { completion.fail(re.getError()); } else { completion.success(re); } } });
以CloudBus的send調(diào)用為例,當(dāng)一個(gè)msg發(fā)送并得到回復(fù)后,便會(huì)執(zhí)行傳進(jìn)來(lái)CallBack的run。這樣的代碼靈活性非常高——簡(jiǎn)單來(lái)說(shuō),傳入send這個(gè)函數(shù)的第二個(gè)參數(shù)是一個(gè)策略,而不是一個(gè)單純的參數(shù)。
CloudBus的源碼分析點(diǎn)擊這里,有興趣的讀者可以看一下其實(shí)現(xiàn)小結(jié)
在本篇文章中,筆者和大家一起了解了Strategy在ZStack中的使用場(chǎng)景。通常在編程時(shí),算法(策略)會(huì)被寫(xiě)在具體方法中,這樣會(huì)導(dǎo)致具體方法中充斥著條件判斷語(yǔ)句。但是Strategy卻特意將算法與其他部分剝離開(kāi)來(lái),僅僅定義了接口,然后再以委托的方式來(lái)使用算法。然而這種做法正是讓程序更加的松耦合(因?yàn)槭褂梦锌梢苑奖愕恼w替換算法),使得整個(gè)項(xiàng)目更加茁壯。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68631.html
摘要:但新增模塊的結(jié)構(gòu)卻還是大致相同,此即是的經(jīng)典設(shè)計(jì)模式這套模式也被開(kāi)發(fā)者稱(chēng)為三駕馬車(chē)。領(lǐng)域?qū)佣x負(fù)責(zé)表達(dá)業(yè)務(wù)概念,業(yè)務(wù)狀態(tài)信息以及業(yè)務(wù)規(guī)則。 本文首發(fā)于泊浮目的專(zhuān)欄:https://segmentfault.com/blog... 前言 隨著ZStack的版本迭代,其可以掌管的資源也越來(lái)越多。但新增模塊的結(jié)構(gòu)卻還是大致相同,此即是ZStack的經(jīng)典設(shè)計(jì)模式——這套模式也被開(kāi)發(fā)者稱(chēng)為ZS...
摘要:但在實(shí)際的二次開(kāi)發(fā)中,這些做法未必能夠完全滿足需求。在源碼剖析之核心庫(kù)鑒賞一文中,我們了解到是的基礎(chǔ)設(shè)施之一,同時(shí)也允許通過(guò)顯示聲明的方式來(lái)聲明。同理,一些也可以使用繼承進(jìn)行擴(kuò)展。 本文首發(fā)于泊浮目的專(zhuān)欄:https://segmentfault.com/blog... 前言 在ZStack博文-5.通用插件系統(tǒng)中,官方提出了幾個(gè)較為經(jīng)典的擴(kuò)展方式。但在實(shí)際的二次開(kāi)發(fā)中,這些做法未必...
摘要:本文首發(fā)于泊浮目的專(zhuān)欄在語(yǔ)言中,有一個(gè)關(guān)鍵字叫做其作用是在函數(shù)前執(zhí)行。一般有兩種用法在該函數(shù)拋出異常時(shí)執(zhí)行。在該函數(shù)返回前執(zhí)行。這里的放入來(lái)自系統(tǒng)啟動(dòng)時(shí)利用反射所做的一個(gè)行為。因此并不會(huì)影響使用時(shí)的性能。 本文首發(fā)于泊浮目的專(zhuān)欄:https://segmentfault.com/blog... 在Go語(yǔ)言中,有一個(gè)關(guān)鍵字叫做defer——其作用是在函數(shù)return前執(zhí)行。在ZStac...
摘要:本文首發(fā)于泊浮目的專(zhuān)欄在語(yǔ)言中,有一個(gè)關(guān)鍵字叫做其作用是在函數(shù)前執(zhí)行。一般有兩種用法在該函數(shù)拋出異常時(shí)執(zhí)行。在該函數(shù)返回前執(zhí)行。這里的放入來(lái)自系統(tǒng)啟動(dòng)時(shí)利用反射所做的一個(gè)行為。因此并不會(huì)影響使用時(shí)的性能。 本文首發(fā)于泊浮目的專(zhuān)欄:https://segmentfault.com/blog... 在Go語(yǔ)言中,有一個(gè)關(guān)鍵字叫做defer——其作用是在函數(shù)return前執(zhí)行。在ZStac...
摘要:每個(gè)消息都會(huì)被一個(gè)線程消費(fèi),同時(shí)最大并發(fā)量為。然后提交一個(gè)任務(wù)到線程池中,這個(gè)任務(wù)的內(nèi)容是從等待隊(duì)列中取出一個(gè),如果等待隊(duì)列為空,則刪除這個(gè)等待隊(duì)列的。小結(jié)本文分析了的久經(jīng)生產(chǎn)考驗(yàn)的核心組件線程池。 本文首發(fā)于泊浮目的專(zhuān)欄:https://segmentfault.com/blog... 前言 在ZStack中,最基本的執(zhí)行單位不僅僅是一個(gè)函數(shù),也可以是一個(gè)任務(wù)(Task。其本質(zhì)實(shí)現(xiàn)...
閱讀 1794·2023-04-25 22:42
閱讀 2218·2021-09-22 15:16
閱讀 3495·2021-08-30 09:44
閱讀 493·2019-08-29 16:44
閱讀 3316·2019-08-29 16:20
閱讀 2521·2019-08-29 16:12
閱讀 3395·2019-08-29 16:07
閱讀 673·2019-08-29 15:08