国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ZStack源碼剖析之設計模式鑒賞——策略模式

Eric / 1288人閱讀

摘要:能夠整體地替換算法,能讓我們輕松地以不同的算法去解決一個問題,這種模式就是模式。這個類是在發(fā)布前常在中被使用的一個類,代碼如下以為例,從語義上來說就是為了中的每個元素調(diào)用函數(shù)。

本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog...
前言

無論什么程序,其目的都是解決問題。而為了解決問題,我們又需要編寫特定的算法。使用Strategy模式可以整體地替換算法的實現(xiàn)部分。能夠整體地替換算法,能讓我們輕松地以不同的算法去解決一個問題,這種模式就是Strategy模式。

在ZStack中,Strategy模式幾乎是充斥在80%以上的代碼中的,接下來我們就來一起看看吧。

CollectionUtils

CollectionUtils 這個類是在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 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) 為例,從語義上來說就是為了from中的每個元素調(diào)用func函數(shù)。沒錯,就像函數(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;
            }
        });

從這邊的代碼可以看到,通過遍歷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

相關文章

  • ZStack源碼剖析設計模式鑒賞——三駕馬車

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

    honhon 評論0 收藏0
  • ZStack源碼剖析二次開發(fā)——可擴展框架

    摘要:但在實際的二次開發(fā)中,這些做法未必能夠完全滿足需求。在源碼剖析之核心庫鑒賞一文中,我們了解到是的基礎設施之一,同時也允許通過顯示聲明的方式來聲明。同理,一些也可以使用繼承進行擴展。 本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog... 前言 在ZStack博文-5.通用插件系統(tǒng)中,官方提出了幾個較為經(jīng)典的擴展方式。但在實際的二次開發(fā)中,這些做法未必...

    lolomaco 評論0 收藏0
  • ZStack源碼剖析核心庫鑒賞——Defer

    摘要:本文首發(fā)于泊浮目的專欄在語言中,有一個關鍵字叫做其作用是在函數(shù)前執(zhí)行。一般有兩種用法在該函數(shù)拋出異常時執(zhí)行。在該函數(shù)返回前執(zhí)行。這里的放入來自系統(tǒng)啟動時利用反射所做的一個行為。因此并不會影響使用時的性能。 本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog... 在Go語言中,有一個關鍵字叫做defer——其作用是在函數(shù)return前執(zhí)行。在ZStac...

    DevWiki 評論0 收藏0
  • ZStack源碼剖析核心庫鑒賞——Defer

    摘要:本文首發(fā)于泊浮目的專欄在語言中,有一個關鍵字叫做其作用是在函數(shù)前執(zhí)行。一般有兩種用法在該函數(shù)拋出異常時執(zhí)行。在該函數(shù)返回前執(zhí)行。這里的放入來自系統(tǒng)啟動時利用反射所做的一個行為。因此并不會影響使用時的性能。 本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog... 在Go語言中,有一個關鍵字叫做defer——其作用是在函數(shù)return前執(zhí)行。在ZStac...

    ymyang 評論0 收藏0
  • ZStack源碼剖析核心庫鑒賞——ThreadFacade

    摘要:每個消息都會被一個線程消費,同時最大并發(fā)量為。然后提交一個任務到線程池中,這個任務的內(nèi)容是從等待隊列中取出一個,如果等待隊列為空,則刪除這個等待隊列的。小結(jié)本文分析了的久經(jīng)生產(chǎn)考驗的核心組件線程池。 本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog... 前言 在ZStack中,最基本的執(zhí)行單位不僅僅是一個函數(shù),也可以是一個任務(Task。其本質(zhì)實現(xiàn)...

    enali 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<