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 傻 瓜 閱讀(787) 評論(0)  編輯  收藏


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


          網站導航:
           

          導航

          統計

          常用鏈接

          留言簿(7)

          我參與的團隊

          隨筆分類

          隨筆檔案

          文章分類

          友情鏈接

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 云梦县| 巨鹿县| 涿鹿县| 怀仁县| 老河口市| 锡林郭勒盟| 鄢陵县| 固始县| 上犹县| 高雄市| 河曲县| 安吉县| 大荔县| 资溪县| 潢川县| 永宁县| 张家港市| 甘孜县| 丹棱县| 北川| 紫金县| 蒲城县| 子洲县| 神木县| 峨眉山市| 青阳县| 永寿县| 宾阳县| 全椒县| 渭南市| 正镶白旗| 米林县| 连平县| 桃园县| 天台县| 乌恰县| 瑞金市| 宣城市| 平阴县| 封丘县| 称多县|