java隨記

          堅持就是勝利!

           

          優(yōu)秀代碼賞析

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


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


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


          網站導航:
           

          導航

          統(tǒng)計

          常用鏈接

          留言簿(7)

          我參與的團隊

          隨筆分類

          隨筆檔案

          文章分類

          友情鏈接

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 洛浦县| 永胜县| 错那县| 札达县| 景宁| 化州市| 天全县| 永仁县| 皋兰县| 鹤庆县| 花垣县| 泗洪县| 嫩江县| 湄潭县| 瑞昌市| 和硕县| 马山县| 兴隆县| 阿拉尔市| 康定县| 乌兰察布市| 新平| 英德市| 黔南| 调兵山市| 墨脱县| 泾阳县| 静安区| 合川市| 玉门市| 辽阳市| 嘉鱼县| 博湖县| 保山市| 台湾省| 镇雄县| 弋阳县| 抚顺县| 勃利县| 乡宁县| 金塔县|