摘要:能夠整體地替換算法,能讓我們輕松地以不同的算法去解決一個問題,這種模式就是模式。這個類是在發(fā)布前常在中被使用的一個類,代碼如下以為例,從語義上來說就是為了中的每個元素調(diào)用函數(shù)。
本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog...前言
無論什么程序,其目的都是解決問題。而為了解決問題,我們又需要編寫特定的算法。使用Strategy模式可以整體地替換算法的實現(xiàn)部分。能夠整體地替換算法,能讓我們輕松地以不同的算法去解決一個問題,這種模式就是Strategy模式。
在ZStack中,Strategy模式幾乎是充斥在80%以上的代碼中的,接下來我們就來一起看看吧。
CollectionUtilsCollectionUtils 這個類是在JDK8發(fā)布前常在ZStack中被使用的一個類,代碼如下:
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; } });
從這邊的代碼可以看到,通過遍歷hostUuids并做了一些操作,成功的組成了一組msg。
Completion在異步系統(tǒng)中,Completion是很常見的——當一個異步行為完成時,則會調(diào)用其相應的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)用為例,當一個msg發(fā)送并得到回復后,便會執(zhí)行傳進來CallBack的run。這樣的代碼靈活性非常高——簡單來說,傳入send這個函數(shù)的第二個參數(shù)是一個策略,而不是一個單純的參數(shù)。
CloudBus的源碼分析點擊這里,有興趣的讀者可以看一下其實現(xiàn)小結(jié)
在本篇文章中,筆者和大家一起了解了Strategy在ZStack中的使用場景。通常在編程時,算法(策略)會被寫在具體方法中,這樣會導致具體方法中充斥著條件判斷語句。但是Strategy卻特意將算法與其他部分剝離開來,僅僅定義了接口,然后再以委托的方式來使用算法。然而這種做法正是讓程序更加的松耦合(因為使用委托可以方便的整體替換算法),使得整個項目更加茁壯。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/68631.html
摘要:但新增模塊的結(jié)構(gòu)卻還是大致相同,此即是的經(jīng)典設計模式這套模式也被開發(fā)者稱為三駕馬車。領域?qū)佣x負責表達業(yè)務概念,業(yè)務狀態(tài)信息以及業(yè)務規(guī)則。 本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog... 前言 隨著ZStack的版本迭代,其可以掌管的資源也越來越多。但新增模塊的結(jié)構(gòu)卻還是大致相同,此即是ZStack的經(jīng)典設計模式——這套模式也被開發(fā)者稱為ZS...
摘要:但在實際的二次開發(fā)中,這些做法未必能夠完全滿足需求。在源碼剖析之核心庫鑒賞一文中,我們了解到是的基礎設施之一,同時也允許通過顯示聲明的方式來聲明。同理,一些也可以使用繼承進行擴展。 本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog... 前言 在ZStack博文-5.通用插件系統(tǒng)中,官方提出了幾個較為經(jīng)典的擴展方式。但在實際的二次開發(fā)中,這些做法未必...
摘要:本文首發(fā)于泊浮目的專欄在語言中,有一個關鍵字叫做其作用是在函數(shù)前執(zhí)行。一般有兩種用法在該函數(shù)拋出異常時執(zhí)行。在該函數(shù)返回前執(zhí)行。這里的放入來自系統(tǒng)啟動時利用反射所做的一個行為。因此并不會影響使用時的性能。 本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog... 在Go語言中,有一個關鍵字叫做defer——其作用是在函數(shù)return前執(zhí)行。在ZStac...
摘要:本文首發(fā)于泊浮目的專欄在語言中,有一個關鍵字叫做其作用是在函數(shù)前執(zhí)行。一般有兩種用法在該函數(shù)拋出異常時執(zhí)行。在該函數(shù)返回前執(zhí)行。這里的放入來自系統(tǒng)啟動時利用反射所做的一個行為。因此并不會影響使用時的性能。 本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog... 在Go語言中,有一個關鍵字叫做defer——其作用是在函數(shù)return前執(zhí)行。在ZStac...
摘要:每個消息都會被一個線程消費,同時最大并發(fā)量為。然后提交一個任務到線程池中,這個任務的內(nèi)容是從等待隊列中取出一個,如果等待隊列為空,則刪除這個等待隊列的。小結(jié)本文分析了的久經(jīng)生產(chǎn)考驗的核心組件線程池。 本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog... 前言 在ZStack中,最基本的執(zhí)行單位不僅僅是一個函數(shù),也可以是一個任務(Task。其本質(zhì)實現(xiàn)...
閱讀 1751·2023-04-25 22:42
閱讀 2202·2021-09-22 15:16
閱讀 3486·2021-08-30 09:44
閱讀 485·2019-08-29 16:44
閱讀 3304·2019-08-29 16:20
閱讀 2512·2019-08-29 16:12
閱讀 3387·2019-08-29 16:07
閱讀 666·2019-08-29 15:08