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

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

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

    java隨記

    堅持就是勝利!

     

    優(yōu)秀代碼賞析

    看開源的源代碼,看到一個有意思的實現(xiàn) 。
    /*
     * 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 接口定義 的方法,這里是其實現(xiàn) 
        public CommitHandler create(String transactionId, Network network) {
            return factory.create(transactionId, network);
        }
    }

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

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


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


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


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿(7)

    我參與的團(tuán)隊

    隨筆分類

    隨筆檔案

    文章分類

    友情鏈接

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品tv久久久久久久久久| 成年女人免费视频播放77777 | 亚洲乱亚洲乱妇无码麻豆| 香蕉视频免费在线播放| 免费看小12萝裸体视频国产| 国产亚洲情侣久久精品| 免费人成年轻人电影| 免费国产草莓视频在线观看黄| 免费一级毛片在级播放| 人人爽人人爽人人片A免费| 国产成人亚洲精品狼色在线| 中文字幕免费在线播放| 亚洲第一区香蕉_国产a| 国产一卡二卡四卡免费| 亚洲狠狠婷婷综合久久| www.亚洲精品.com| a毛片在线看片免费| 亚洲国产精品久久66| 一二三四在线播放免费观看中文版视频 | 一区二区免费在线观看| 亚洲性猛交XXXX| 91av视频免费在线观看| 亚洲成人激情小说| 免费一看一级毛片全播放| 三级黄色免费观看| 亚洲国产日产无码精品| 国产免费拔擦拔擦8x| 两个人的视频www免费| 亚洲videos| 亚洲无线一二三四区手机| 99re6在线视频精品免费下载| 国产成人精品日本亚洲11| 亚洲?V无码成人精品区日韩| 青柠影视在线观看免费| 亚洲人和日本人jizz| 四虎影视精品永久免费网站| 国产精品免费无遮挡无码永久视频 | 亚洲色大成网站www永久网站| 亚洲国产a级视频| 18女人水真多免费高清毛片| 美女扒开尿口给男人爽免费视频|