乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      重學(xué) Java 設(shè)計模式:實戰(zhàn)模版模式「模擬爬蟲各類電商商品,生成營銷推廣海報場景」

       小傅哥 2021-12-13

      作者:小傅哥
      博客:https://

      ?

      沉淀、分享、成長,讓自己和他人都能有所收獲!??

      ?

      目錄

      • 一、前言

      • 二、開發(fā)環(huán)境

      • 三、模版模式介紹

      • 四、案例場景模擬

      • 五、模版模式搭建工程

        • 1. 工程結(jié)構(gòu)

        • 2. 代碼實現(xiàn)

        • 3. 測試驗證

      • 六、總結(jié)

      一、前言

      黎明前的堅守,的住嗎?

      有人舉過這樣一個例子,先給你張北大的錄取通知書,但要求你每天5點起床,12點睡覺??,刻苦學(xué)習(xí),勤奮上進。只要你堅持三年,這張通知書就有效。如果是你,你能堅持嗎?其實對于這個例子很難在我們的人生中出現(xiàn),因為它目標(biāo)明確,有準(zhǔn)確的行軍路線。就像你是土豪家庭,家里給你安排的明明白白一樣,只要你按照這個方式走就不會有問題。可大多數(shù)時候我們并沒有這樣的路線,甚至不知道多久到達(dá)自己的黎明。但!誰又不渴望見到黎明呢,堅持吧!

      不要輕易被洗腦

      鍵盤俠?、網(wǎng)絡(luò)噴壺,幾乎當(dāng)你努力堅持一件事的時候,在這條路上會遇到形形色色的人和事。有時候接收建議完善自己是有必要的,但不能放棄自己的初心和底線,有時候只堅持自己也是難能可貴的。子路之勇,子貢之辯,冉有之智,此三子者,皆天下之所謂難能而可貴者也。陽光和努力是這個世界最溫暖的東西,加油堅持好自己的選的路。

      有時還好堅持了

      當(dāng)你為自己的一個決定而感到萬分開心??時,是不是也非常感謝自己還好堅持了。堅持、努力、終身學(xué)習(xí),似乎在程序員這個行業(yè)是離不開的,當(dāng)你意愿于把這當(dāng)做一份可以努力的愛好時,你就會愿意為此而努力。而我們很難說只在機會要來時準(zhǔn)備,而是一直努力等待機會。也就是很多人說的別人抓住機會是因為一直在準(zhǔn)備著。

      二、開發(fā)環(huán)境

      1. JDK 1.8
      2. Idea + Maven
      3. 涉及工程三個,可以通過關(guān)注「公眾號」bugstack蟲洞棧,回復(fù)源碼下載獲取(打開獲取的鏈接,找到序號18)
      工程描述
      itstack-demo-design-21-00場景模擬工程;模擬爬蟲商品生成海報場景

      三、模版模式介紹

      模版模式,圖片來自 refactoringguru.cn

      模板模式的核心設(shè)計思路是通過在,抽象類中定義抽象方法的執(zhí)行順序,并將抽象方法設(shè)定為只有子類實現(xiàn),但不設(shè)計獨立訪問的方法。簡單說也就是把你安排的明明白白的。

      西游記,孫悟空打妖怪

      就像西游記的99八十一難,基本每一關(guān)都是;師傅被擄走、打妖怪、妖怪被收走,具體什么妖怪你自己定義,怎么打你想辦法,最后收走還是弄死看你本事,我只定義執(zhí)行順序和基本策略,具體的每一難由觀音來安排。

      四、案例場景模擬

      場景模擬;爬蟲電商商品,組裝優(yōu)惠推廣

      「在本案例中我們模擬爬蟲各類電商商品,生成營銷推廣海報場景」

      關(guān)于模版模式的核心點在于由抽象類定義抽象方法執(zhí)行策略,也就是說父類規(guī)定了好一系列的執(zhí)行標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)的串聯(lián)成一整套業(yè)務(wù)流程。

      在這個場景中我們模擬爬蟲爬取各類商家的商品信息,生成推廣海報(海報中含帶個人的邀請碼)賺取商品返利。聲明,這里是模擬爬取,并沒有真的爬取

      而整個的爬取過程分為;模擬登錄、爬取信息、生成海報,這三個步驟,另外;

      1. 因為有些商品只有登錄后才可以爬取,并且登錄可以看到一些特定的價格這與未登錄用戶看到的價格不同。
      2. 不同的電商網(wǎng)站爬取方式不同,解析方式也不同,因此可以作為每一個實現(xiàn)類中的特定實現(xiàn)。
      3. 生成海報的步驟基本一樣,但會有特定的商品來源標(biāo)識。所以這樣三個步驟可以使用模版模式來設(shè)定,并有具體的場景做子類實現(xiàn)。

      五、模版模式搭建工程

      模版模式的業(yè)務(wù)場景可能在平時的開發(fā)中并不是很多,主要因為這個設(shè)計模式會在抽象類中定義邏輯行為的執(zhí)行順序。一般情況下,我們用的抽象類定義的邏輯行為都比較輕量級或者沒有,只是提供一些基本方法公共調(diào)用和實現(xiàn)。

      但如果遇到適合的場景使用這樣的設(shè)計模式也是非常方便的,因為他可以控制整套邏輯的執(zhí)行順序和統(tǒng)一的輸入、輸出,而對于實現(xiàn)方只需要關(guān)心好自己的業(yè)務(wù)邏輯即可。

      而在我們這個場景中,只需要記住這三步的實現(xiàn)即可;模擬登錄、爬取信息、生成海報

      1. 工程結(jié)構(gòu)

      itstack-demo-design-21-00
      └── src
          ├── main
          │   └── java
          │       └── org.itstack.demo.design
          │           ├── group
          │           │   ├── DangDangNetMall.java
          │           │   ├── JDNetMall.java
          │           │   └── TaoBaoNetMall.java
          │           ├──  HttpClient.java
          │           └──  NetMall.java
          └── test
              └── java
                  └── org.itstack.demo.design.test
                      └── ApiTest.java

      「模版模式模型結(jié)構(gòu)」

      模版模式模型結(jié)構(gòu)
      • 以上的代碼結(jié)構(gòu)還是比較簡單的,一個定義了抽象方法執(zhí)行順序的核心抽象類,以及三個模擬具體的實現(xiàn)(京東、淘寶當(dāng)當(dāng))的電商服務(wù)。

      2. 代碼實現(xiàn)

      2.1 定義執(zhí)行順序的抽象類

      /**
       * 基礎(chǔ)電商推廣服務(wù)
       * 1. 生成最優(yōu)價商品海報
       * 2. 海報含帶推廣邀請碼
       */

      public abstract class NetMall {

          protected Logger logger = LoggerFactory.getLogger(NetMall.class);

          String uId;   // 用戶ID
          String uPwd;  // 用戶密碼

          public NetMall(String uId, String uPwd) {
              this.uId = uId;
              this.uPwd = uPwd;
          }

          /**
           * 生成商品推廣海報
           *
           * @param skuUrl 商品地址(京東、淘寶、當(dāng)當(dāng))
           * @return 海報圖片base64位信息
           */

          public String generateGoodsPoster(String skuUrl) {
              if (!login(uId, uPwd)) return null;             // 1. 驗證登錄
              Map<String, String> reptile = reptile(skuUrl);  // 2. 爬蟲商品
              return createBase64(reptile);                   // 3. 組裝海報
          }

          // 模擬登錄
          protected abstract Boolean login(String uId, String uPwd);

          // 爬蟲提取商品信息(登錄后的優(yōu)惠價格)
          protected abstract Map<String, String> reptile(String skuUrl);

          // 生成商品海報信息
          protected abstract String createBase64(Map<String, String> goodsInfo);

      }
      • 這個類是此設(shè)計模式的靈魂
      • 定義可被外部訪問的方法generateGoodsPoster,用于生成商品推廣海報
      • generateGoodsPoster 在方法中定義抽象方法的執(zhí)行順序 1 2 3 步
      • 提供三個具體的抽象方法,讓外部繼承方實現(xiàn);模擬登錄(login)、模擬爬取(reptile)、生成海報(createBase64)

      2.2 模擬爬蟲京東

      public class JDNetMall extends NetMall {

          public JDNetMall(String uId, String uPwd) {
              super(uId, uPwd);
          }

          public Boolean login(String uId, String uPwd) {
              logger.info("模擬京東用戶登錄 uId:{} uPwd:{}", uId, uPwd);
              return true;
          }

          public Map<String, String> reptile(String skuUrl) {
              String str = HttpClient.doGet(skuUrl);
              Pattern p9 = Pattern.compile("(?<=title\\>).*(?=</title)");
              Matcher m9 = p9.matcher(str);
              Map<String, String> map = new ConcurrentHashMap<String, String>();
              if (m9.find()) {
                  map.put("name", m9.group());
              }
              map.put("price""5999.00");
              logger.info("模擬京東商品爬蟲解析:{} | {} 元 {}", map.get("name"), map.get("price"), skuUrl);
              return map;
          }

          public String createBase64(Map<String, String> goodsInfo) {
              BASE64Encoder encoder = new BASE64Encoder();
              logger.info("模擬生成京東商品base64海報");
              return encoder.encode(JSON.toJSONString(goodsInfo).getBytes());
          }

      }
      • 模擬登錄
      • 爬取信息,這里只是把title的信息爬取后的結(jié)果截取出來。
      • 模擬創(chuàng)建base64圖片的方法

      2.3 模擬爬蟲淘寶

      public class TaoBaoNetMall extends NetMall {

          public TaoBaoNetMall(String uId, String uPwd) {
              super(uId, uPwd);
          }

          @Override
          public Boolean login(String uId, String uPwd) {
              logger.info("模擬淘寶用戶登錄 uId:{} uPwd:{}", uId, uPwd);
              return true;
          }

          @Override
          public Map<String, String> reptile(String skuUrl) {
              String str = HttpClient.doGet(skuUrl);
              Pattern p9 = Pattern.compile("(?<=title\\>).*(?=</title)");
              Matcher m9 = p9.matcher(str);
              Map<String, String> map = new ConcurrentHashMap<String, String>();
              if (m9.find()) {
                  map.put("name", m9.group());
              }
              map.put("price""4799.00");
              logger.info("模擬淘寶商品爬蟲解析:{} | {} 元 {}", map.get("name"), map.get("price"), skuUrl);
              return map;
          }

          @Override
          public String createBase64(Map<String, String> goodsInfo) {
              BASE64Encoder encoder = new BASE64Encoder();
              logger.info("模擬生成淘寶商品base64海報");
              return encoder.encode(JSON.toJSONString(goodsInfo).getBytes());
          }

      }
      • 同上,模擬登錄和爬取以及創(chuàng)建圖片的base64

      2.4 模擬爬蟲當(dāng)當(dāng)

      public class DangDangNetMall extends NetMall {

          public DangDangNetMall(String uId, String uPwd) {
              super(uId, uPwd);
          }

          @Override
          public Boolean login(String uId, String uPwd) {
              logger.info("模擬當(dāng)當(dāng)用戶登錄 uId:{} uPwd:{}", uId, uPwd);
              return true;
          }

          @Override
          public Map<String, String> reptile(String skuUrl) {
              String str = HttpClient.doGet(skuUrl);
              Pattern p9 = Pattern.compile("(?<=title\\>).*(?=</title)");
              Matcher m9 = p9.matcher(str);
              Map<String, String> map = new ConcurrentHashMap<String, String>();
              if (m9.find()) {
                  map.put("name", m9.group());
              }
              map.put("price""4548.00");
              logger.info("模擬當(dāng)當(dāng)商品爬蟲解析:{} | {} 元 {}", map.get("name"), map.get("price"), skuUrl);
              return map;
          }

          @Override
          public String createBase64(Map<String, String> goodsInfo) {
              BASE64Encoder encoder = new BASE64Encoder();
              logger.info("模擬生成當(dāng)當(dāng)商品base64海報");
              return encoder.encode(JSON.toJSONString(goodsInfo).getBytes());
          }

      }
      • 同上,模擬登錄和爬取以及創(chuàng)建圖片的base64

      3. 測試驗證

      3.1 編寫測試類

      /**
       * 測試鏈接
       * 京東;https://item.jd.com/100008348542.html
       * 淘寶;https://detail.tmall.com/item.htm
       * 當(dāng)當(dāng);http://product.dangdang.com/1509704171.html
       */

      @Test
      public void test_NetMall() {
          NetMall netMall = new JDNetMall("1000001","*******");
          String base64 = netMall.generateGoodsPoster("https://item.jd.com/100008348542.html");
          logger.info("測試結(jié)果:{}", base64);
      }
      • 測試類提供了三個商品鏈接,也可以是其他商品的鏈接
      • 爬取的過程模擬爬取京東商品,可以替換為其他商品服務(wù)new JDNetMallnew TaoBaoNetMall、new DangDangNetMall

      3.2 測試結(jié)果

      23:33:13.616 [main] INFO org.itstack.demo.design.NetMall - 模擬京東用戶登錄 uId:1000001 uPwd:*******
      23:33:15.038 [main] INFO org.itstack.demo.design.NetMall - 模擬京東商品爬蟲解析:【AppleiPhone 11】Apple iPhone 11 (A2223) 128GB 黑色 移動聯(lián)通電信4G手機 雙卡雙待【行情 報價 價格 評測】-京東 | 5999.00 元 https://item.jd.com/100008348542.html
      23:33:15.038 [main] INFO  org.itstack.demo.design.NetMall - 模擬生成京東商品base64海報
      23:33:15.086 [main] INFO org.itstack.demo.design.test.ApiTest - 測試結(jié)果:eyJwcmljZSI6IjU5OTkuMDAiLCJuYW1lIjoi44CQQXBwbGVpUGhvbmUgMTHjgJFBcHBsZSBpUGhv
      bmUgMTEgKEEyMjIzKSAxMjhHQiDpu5HoibIg56e75Yqo6IGU6YCa55S15L+hNEfmiYvmnLog5Y+M
      5Y2h5Y+M5b6F44CQ6KGM5oOFIOaKpeS7tyDku7fmoLwg6K+E5rWL44CRLeS6rOS4nCJ9

      Process finished with exit code 0

      六、總結(jié)

      • 通過上面的實現(xiàn)可以看到模版模式在定義統(tǒng)一結(jié)構(gòu)也就是執(zhí)行標(biāo)準(zhǔn)上非常方便,也就很好的控制了后續(xù)的實現(xiàn)者不用關(guān)心調(diào)用邏輯,按照統(tǒng)一方式執(zhí)行。那么類的繼承者只需要關(guān)心具體的業(yè)務(wù)邏輯實現(xiàn)即可。
      • 另外模版模式也是為了解決子類通用方法,放到父類中設(shè)計的優(yōu)化。讓每一個子類只做子類需要完成的內(nèi)容,而不需要關(guān)心其他邏輯。這樣提取公用代碼,行為由父類管理,擴展可變部分,也就非常有利于開發(fā)拓展和迭代。
      • 但每一種設(shè)計模式都有自己的特定場景,如果超過場景外的建設(shè)就需要額外考慮??其他模式的運用。而不是非要生搬硬套,否則自己不清楚為什么這么做,也很難讓后續(xù)者繼續(xù)維護代碼。而想要活學(xué)活用就需要多加練習(xí),有實踐的經(jīng)歷。

      bugstack蟲洞棧

      沉淀、分享、成長,讓自己和他人都能有所收獲!

        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多