2024050802-重学 Java 设计模式《实战模板模式》

06-15 1064阅读

重学 Java 设计模式:实战模版模式「模拟爬虫各类电商商品,生成营销推广海报场景」

一、前言

黎明前的坚守,的住吗?

有人举过这样一个例子,先给你张北大的录取通知书,但要求你每天5点起床,12点睡觉😪,刻苦学习,勤奋上进。只要你坚持三年,这张通知书就有效。如果是你,你能坚持吗?其实对于这个例子很难在我们的人生中出现,因为它目标明确,有准确的行军路线。就像你是土豪家庭,家里给你安排的明明白白一样,只要你按照这个方式走就不会有问题。可大多数时候我们并没有这样的路线,甚至不知道多久到达自己的黎明。但!谁又不渴望见到黎明呢,坚持吧!

不要轻易被洗脑

键盘侠⌨、网络喷壶,几乎当你努力坚持一件事的时候,在这条路上会遇到形形色色的人和事。有时候接收建议完善自己是有必要的,但不能放弃自己的初心和底线,有时候只坚持自己也是难能可贵的。子路之勇,子贡之辩,冉有之智,此三子者,皆天下之所谓难能而可贵者也。阳光和努力是这个世界最温暖的东西,加油坚持好自己的选的路。

有时还好坚持了

当你为自己的一个决定而感到万分开心😄时,是不是也非常感谢自己还好坚持了。坚持、努力、终身学习,似乎在程序员这个行业是离不开的,当你意愿于把这当做一份可以努力的爱好时,你就会愿意为此而努力。而我们很难说只在机会要来时准备,而是一直努力等待机会。也就是很多人说的别人抓住机会是因为一直在准备着。

二、开发环境

  1. JDK 1.8
  2. Idea + Maven
  3. 涉及工程三个,可以通过关注公众号:bugstack虫洞栈,回复源码下载获取(打开获取的链接,找到序号18)
工程描述
itstack-demo-design-21-00场景模拟工程;模拟爬虫商品生成海报场景

三、模版模式介绍

2024050802-重学 Java 设计模式《实战模板模式》

  • 图片来自:https://refactoringguru.cn/design-patterns/template-method

    模板模式的核心设计思路是通过在,抽象类中定义抽象方法的执行顺序,并将抽象方法设定为只有子类实现,但不设计独立访问的方法。简单说也就是把你安排的明明白白的。

    2024050802-重学 Java 设计模式《实战模板模式》

    就像西游记的99八十一难,基本每一关都是;师傅被掳走、打妖怪、妖怪被收走,具体什么妖怪你自己定义,怎么打你想办法,最后收走还是弄死看你本事,我只定义执行顺序和基本策略,具体的每一难由观音来安排。

    四、案例场景模拟

    2024050802-重学 Java 设计模式《实战模板模式》

    在本案例中我们模拟爬虫各类电商商品,生成营销推广海报场景

    关于模版模式的核心点在于由抽象类定义抽象方法执行策略,也就是说父类规定了好一系列的执行标准,这些标准的串联成一整套业务流程。

    在这个场景中我们模拟爬虫爬取各类商家的商品信息,生成推广海报(海报中含带个人的邀请码)赚取商品返利。声明,这里是模拟爬取,并没有真的爬取

    而整个的爬取过程分为;模拟登录、爬取信息、生成海报,这三个步骤,另外;

    1. 因为有些商品只有登录后才可以爬取,并且登录可以看到一些特定的价格这与未登录用户看到的价格不同。
    2. 不同的电商网站爬取方式不同,解析方式也不同,因此可以作为每一个实现类中的特定实现。
    3. 生成海报的步骤基本一样,但会有特定的商品来源标识。所以这样三个步骤可以使用模版模式来设定,并有具体的场景做子类实现。

    五、模版模式搭建工程

    模版模式的业务场景可能在平时的开发中并不是很多,主要因为这个设计模式会在抽象类中定义逻辑行为的执行顺序。一般情况下,我们用的抽象类定义的逻辑行为都比较轻量级或者没有,只是提供一些基本方法公共调用和实现。

    但如果遇到适合的场景使用这样的设计模式也是非常方便的,因为他可以控制整套逻辑的执行顺序和统一的输入、输出,而对于实现方只需要关心好自己的业务逻辑即可。

    而在我们这个场景中,只需要记住这三步的实现即可;模拟登录、爬取信息、生成海报

    1. 工程结构

    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
    

    模版模式模型结构

    2024050802-重学 Java 设计模式《实战模板模式》

    • 以上的代码结构还是比较简单的,一个定义了抽象方法执行顺序的核心抽象类,以及三个模拟具体的实现(京东、淘宝、当当)的电商服务。

      2. 代码实现

      2.1 定义执行顺序的抽象类
      /**
       * 基础电商推广服务
       * 1. 生成最优价商品海报
       * 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 商品地址(京东、淘宝、当当)
           * @return 海报图片base64位信息
           */
          public String generateGoodsPoster(String skuUrl) {
              if (!login(uId, uPwd)) return null;             // 1. 验证登录
              Map reptile = reptile(skuUrl);  // 2. 爬虫商品
              return createBase64(reptile);                   // 3. 组装海报
          }
          // 模拟登录
          protected abstract Boolean login(String uId, String uPwd);
          // 爬虫提取商品信息(登录后的优惠价格)
          protected abstract Map reptile(String skuUrl);
          // 生成商品海报信息
          protected abstract String createBase64(Map goodsInfo);
      }
      
      • 这个类是此设计模式的灵魂
      • 定义可被外部访问的方法generateGoodsPoster,用于生成商品推广海报
      • generateGoodsPoster 在方法中定义抽象方法的执行顺序 1 2 3 步
      • 提供三个具体的抽象方法,让外部继承方实现;模拟登录(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 reptile(String skuUrl) {
                String str = HttpClient.doGet(skuUrl);
                Pattern p9 = Pattern.compile("(?).*(?=
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]