成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

ZStack源碼剖析之設(shè)計(jì)模式鑒賞——策略模式

Eric / 1306人閱讀

摘要:能夠整體地替換算法,能讓我們輕松地以不同的算法去解決一個(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)一起看看吧。

CollectionUtils

CollectionUtils 這個(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 static  List 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 List transformToList(Collection from, Function func) 為例,從語(yǔ)義上來(lái)說(shuō)就是為了from中的每個(gè)元素調(diào)用func函數(shù)。沒(méi)錯(cuò),就像函數(shù)式編程中的map。

        List msgs = 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

相關(guān)文章

  • ZStack源碼剖析設(shè)計(jì)模式鑒賞——三駕馬車(chē)

    摘要:但新增模塊的結(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...

    honhon 評(píng)論0 收藏0
  • ZStack源碼剖析二次開(kāi)發(fā)——可擴(kuò)展框架

    摘要:但在實(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ā)中,這些做法未必...

    lolomaco 評(píng)論0 收藏0
  • ZStack源碼剖析核心庫(kù)鑒賞——Defer

    摘要:本文首發(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...

    DevWiki 評(píng)論0 收藏0
  • ZStack源碼剖析核心庫(kù)鑒賞——Defer

    摘要:本文首發(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...

    ymyang 評(píng)論0 收藏0
  • ZStack源碼剖析核心庫(kù)鑒賞——ThreadFacade

    摘要:每個(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)...

    enali 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<