<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java隨記

    堅持就是勝利!

     

    優秀代碼賞析

    看開源的源代碼,看到一個有意思的實現 。
    /*
     * Copyright 2019 IBM All Rights Reserved.
     *
     * SPDX-License-Identifier: Apache-2.0
     */
    package org.hyperledger.fabric.gateway;
    import org.hyperledger.fabric.gateway.impl.AllCommitStrategy;
    import org.hyperledger.fabric.gateway.impl.AnyCommitStrategy;
    import org.hyperledger.fabric.gateway.impl.CommitHandlerImpl;
    import org.hyperledger.fabric.gateway.impl.CommitStrategy;
    import org.hyperledger.fabric.gateway.impl.NoOpCommitHandler;
    import org.hyperledger.fabric.gateway.spi.CommitHandler;
    import org.hyperledger.fabric.gateway.spi.CommitHandlerFactory;
    import org.hyperledger.fabric.sdk.Peer;
    import org.hyperledger.fabric.sdk.exception.InvalidArgumentException;
    import java.util.Collection;
    /**
     * Default commit handler implementations. Instances can be referenced directly or looked up by name, for example
     * {@code DefaultCommitHandlers.valueOf("NONE")}.
     */
    public enum DefaultCommitHandlers implements CommitHandlerFactory {
        /**
         * Do not wait for any commit events to be received from peers after submitting a transaction.
         */
        NONE((transactionId, network) -> NoOpCommitHandler.INSTANCE),
        /**
         * Wait to receive commit events from all currently responding peers in the user's organization after submitting
         * a transaction.
         */
        MSPID_SCOPE_ALLFORTX((transactionId, network) -> {
            Collection<Peer> peers = getPeersForOrganization(network);
            CommitStrategy strategy = new AllCommitStrategy(peers);
            CommitHandler handler = new CommitHandlerImpl(transactionId, network, strategy);
            return handler;
        }),
        /**
         * Wait to receive commit events from all currently responding peers in the network after submitting a transaction.
         */
        NETWORK_SCOPE_ALLFORTX((transactionId, network) -> {
            Collection<Peer> peers = network.getChannel().getPeers();
            CommitStrategy strategy = new AllCommitStrategy(peers);
            CommitHandler handler = new CommitHandlerImpl(transactionId, network, strategy);
            return handler;
        }),
        /**
         * Wait to receive a commit event from any currently responding peer in the user's organization after submitting
         * a transaction.
         */
        MSPID_SCOPE_ANYFORTX((transactionId, network) -> {
            Collection<Peer> peers = getPeersForOrganization(network);
            CommitStrategy strategy = new AnyCommitStrategy(peers);
            CommitHandler handler = new CommitHandlerImpl(transactionId, network, strategy);
            return handler;
        }),
        /**
         * Wait to receive a commit event from any currently responding peer in the network after submitting a transaction.
         */
        NETWORK_SCOPE_ANYFORTX((transactionId, network) -> {
            Collection<Peer> peers = network.getChannel().getPeers();
            CommitStrategy strategy = new AnyCommitStrategy(peers);
            CommitHandler handler = new CommitHandlerImpl(transactionId, network, strategy);
            return handler;
        });
        private final CommitHandlerFactory factory;
        DefaultCommitHandlers(CommitHandlerFactory factory) {
            this.factory = factory;
        }
        private static Collection<Peer> getPeersForOrganization(Network network) {
            String mspId = network.getGateway().getIdentity().getMspId();
            try {
                return network.getChannel().getPeersForOrganization(mspId);
            } catch (InvalidArgumentException e) {
                // This should never happen as mspId should not be null
                throw new RuntimeException(e);
            }
        }

       //CommitHandlerFactory 接口定義 的方法,這里是其實現 
        public CommitHandler create(String transactionId, Network network) {
            return factory.create(transactionId, network);
        }
    }

    先看看enum類的構造函數
        DefaultCommitHandlers(CommitHandlerFactory factory) {
            this.factory = factory;
        }
    需要一個 CommitHandlerFactory 是個接口,同時 enum類本身也實現了這個接口。
    再來看調用過程 
    CommitHandlerFactory commitHandlerFactory = DefaultCommitHandlers.MSPID_SCOPE_ALLFORTX;
    這里會調用CommitHandlerFactory 構造函數,其傳入參數是
    (transactionId, network) -> {
            Collection<Peer> peers = network.getChannel().getPeers();
            CommitStrategy strategy = new AllCommitStrategy(peers);
            CommitHandler handler = new CommitHandlerImpl(transactionId, network, strategy);
            return handler;
        }
    它是lamdba寫法,看看構造函數需要一個 CommitHandlerFactory 接口,這個lamdba 函數其實就是CommitHandlerFactory 的實現。
    這樣MSPID_SCOPE_ALLFORTX 枚舉類型就有了一個  CommitHandlerFactory實現類的引用。

    再看create調用。
    CommitHandler commitHandler = commitHandlerFactory.create(transactionId, network);
    這里enum類的create方法會執行, return factory.create(transactionId, network);
    返回一個 CommitHandler .這里才會真正執行那個 lamdba定義的函數。
    到這里只看到lamdb應用。。。
    再分析一下create ,枚舉類里的每個枚舉變量都會實現一個這個方法。這里可以看到它其實是一個工廠類。
    它創造的產品是CommitHandler ,其具體實現是CommitHandlerImpl類。
    這里巧妙的使用一個enum當工廠類的實現。整個代碼用了工廠模式加策略模式的實現。
    優點:得宜于lamdb的應用,減少了具體工廠類的實現。
    缺點:工廠模式可以實現不改動程序創建產品。那么這里如果要增一個產品,對這個enum類需要再添加一個枚舉變量。
    這個enum類有改動。


    posted on 2019-07-06 12:06 傻 瓜 閱讀(776) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    導航

    統計

    常用鏈接

    留言簿(7)

    我參與的團隊

    隨筆分類

    隨筆檔案

    文章分類

    友情鏈接

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 曰批视频免费40分钟试看天天| 暖暖免费中文在线日本| 99久久免费看国产精品| 亚洲狠狠婷婷综合久久久久| 亚美影视免费在线观看| 亚洲国产高清精品线久久| 一本一道dvd在线观看免费视频 | 99在线免费观看视频| 亚洲高清在线视频| 日本最新免费网站| 亚洲一区精彩视频| 国产午夜免费福利红片| 欧亚一级毛片免费看| 亚洲人JIZZ日本人| 久久aⅴ免费观看| 亚洲电影在线播放| 在线观看成人免费视频| 一区二区三区免费视频网站| 亚洲成a人片在线观看日本| 亚洲毛片免费观看| 亚洲风情亚Aⅴ在线发布| 国产成人高清亚洲| 99久久人妻精品免费一区| 亚洲一区免费在线观看| 免费h黄肉动漫在线观看| 国产无遮挡又黄又爽免费网站| 91亚洲国产成人精品下载| 成全视频免费高清 | 亚洲三级在线播放| 国产精品四虎在线观看免费 | 亚洲一级片免费看| 91大神亚洲影视在线| 国产免费观看视频| 免费在线观看一级片| 亚洲天堂男人影院| 伊人久久精品亚洲午夜| 99国产精品永久免费视频| 免费一区二区三区在线视频| 亚洲蜜芽在线精品一区| 亚洲av日韩av欧v在线天堂| 免费福利电影在线观看|