做者:小傅哥
博客:bugstack.cn - 原創系列專題文章
html
沉澱、分享、成長,讓本身和他人都能有所收穫!😄java
黎明前的堅守,的住嗎?
程序員
有人舉過這樣一個例子,先給你張北大的錄取通知書,但要求你天天5點起牀,12點睡覺😪,刻苦學習,勤奮上進。只要你堅持三年,這張通知書就有效。若是是你,你能堅持嗎?其實對於這個例子很難在咱們的人生中出現,由於它目標明確,有準確的行軍路線。就像你是土豪家庭,家裏給你安排的明明白白同樣,只要你按照這個方式走就不會有問題。可大多數時候咱們並無這樣的路線,甚至不知道多久到達本身的黎明。但!誰又不渴望見到黎明呢,堅持吧!設計模式
不要輕易被洗腦
微信
鍵盤俠⌨
、網絡噴壺
,幾乎當你努力堅持一件事的時候,在這條路上會遇到形形色色的人和事。有時候接收建議完善本身是有必要的,但不能放棄本身的初心和底線,有時候只堅持本身也是難能難得的。子路之勇,子貢之辯,冉有之智,此三子者,皆天下之所謂難能而難得者也
。陽光和努力是這個世界最溫暖的東西,加油堅持好本身的選的路。網絡
有時還好堅持了
ide
當你爲本身的一個決定而感到萬分開心😄時,是否是也很是感謝本身還好堅持了。堅持、努力、終身學習,彷佛在程序員這個行業是離不開的,當你意願於把這當作一份能夠努力的愛好時,你就會願意爲此而努力。而咱們很難說只在機會要來時準備,而是一直努力等待機會。也就是不少人說的別人抓住機會是由於一直在準備着。學習
bugstack蟲洞棧
,回覆源碼下載
獲取(打開獲取的連接,找到序號18)工程 | 描述 |
---|---|
itstack-demo-design-21-00 | 場景模擬工程;模擬爬蟲商品生成海報場景 |
模板模式的核心設計思路是經過在,抽象類中定義抽象方法的執行順序,並將抽象方法設定爲只有子類實現,但不設計獨立訪問
的方法。簡單說也就是把你安排的明明白白的。測試
就像西遊記的99八十一難,基本每一關都是;師傅被擄走、打妖怪、妖怪被收走,具體什麼妖怪你本身定義,怎麼打你想辦法,最後收走仍是弄死看你本事,我只定義執行順序和基本策略,具體的每一難由觀音來安排。優化
在本案例中咱們模擬爬蟲各種電商商品,生成營銷推廣海報場景
關於模版模式的核心點在於由抽象類定義抽象方法執行策略,也就是說父類規定了好一系列的執行標準,這些標準的串聯成一整套業務流程。
在這個場景中咱們模擬爬蟲爬取各種商家的商品信息,生成推廣海報(海報中含帶我的的邀請碼
)賺取商品返利。聲明,這裏是模擬爬取,並無真的爬取
而整個的爬取過程分爲;模擬登陸、爬取信息、生成海報,這三個步驟,另外;
模版模式的業務場景可能在平時的開發中並非不少,主要由於這個設計模式會在抽象類中定義邏輯行爲的執行順序。通常狀況下,咱們用的抽象類定義的邏輯行爲都比較輕量級或者沒有,只是提供一些基本方法公共調用和實現。
但若是遇到適合的場景使用這樣的設計模式也是很是方便的,由於他能夠控制整套邏輯的執行順序和統一的輸入、輸出,而對於實現方只須要關心好本身的業務邏輯便可。
而在咱們這個場景中,只須要記住這三步的實現便可;模擬登陸
、爬取信息
、生成海報
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
複製代碼
模版模式模型結構
京東
、淘寶
、噹噹
)的電商服務。/** * 基礎電商推廣服務 * 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<String, String> reptile = reptile(skuUrl); // 2. 爬蟲商品
return createBase64(reptile); // 3. 組裝海報
}
// 模擬登陸
protected abstract Boolean login(String uId, String uPwd);
// 爬蟲提取商品信息(登陸後的優惠價格)
protected abstract Map<String, String> reptile(String skuUrl);
// 生成商品海報信息
protected abstract String createBase64(Map<String, String> goodsInfo);
}
複製代碼
generateGoodsPoster
,用於生成商品推廣海報generateGoodsPoster
在方法中定義抽象方法的執行順序 1 2 3 步login
)、模擬爬取(reptile
)、生成海報(createBase64
)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
的信息爬取後的結果截取出來。base64
圖片的方法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());
}
}
複製代碼
base64
public class DangDangNetMall extends NetMall {
public DangDangNetMall(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", "4548.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());
}
}
複製代碼
base64
/** * 測試連接 * 京東;https://item.jd.com/100008348542.html * 淘寶;https://detail.tmall.com/item.htm * 噹噹;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("測試結果:{}", base64);
}
複製代碼
new JDNetMall
、new TaoBaoNetMall
、new DangDangNetMall
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 黑色 移動聯通電信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 - 測試結果:eyJwcmljZSI6IjU5OTkuMDAiLCJuYW1lIjoi44CQQXBwbGVpUGhvbmUgMTHjgJFBcHBsZSBpUGhv
bmUgMTEgKEEyMjIzKSAxMjhHQiDpu5HoibIg56e75Yqo6IGU6YCa55S15L+hNEfmiYvmnLog5Y+M
5Y2h5Y+M5b6F44CQ6KGM5oOFIOaKpeS7tyDku7fmoLwg6K+E5rWL44CRLeS6rOS4nCJ9
Process finished with exit code 0
複製代碼
模版模式
在定義統一結構也就是執行標準上很是方便,也就很好的控制了後續的實現者不用關心調用邏輯,按照統一方式執行。那麼類的繼承者只須要關心具體的業務邏輯實現便可。1. 重學 Java 設計模式:實戰工廠方法模式「多種類型商品不一樣接口,統一發獎服務搭建場景」
2. 重學 Java 設計模式:實戰原型模式「上機考試多套試,每人題目和答案亂序排列場景」
3. 重學 Java 設計模式:實戰橋接模式「多支付渠道(微信、支付寶)與多支付模式(刷臉、指紋)場景」
4. 重學 Java 設計模式:實戰組合模式「營銷差別化人羣發券,決策樹引擎搭建場景」
5. 重學 Java 設計模式:實戰外觀模式「基於SpringBoot開發門面模式中間件,統一控制接口白名單場景」
6. 重學 Java 設計模式:實戰享元模式「基於Redis秒殺,提供活動與庫存信息查詢場景」
7. 重學 Java 設計模式:實戰備忘錄模式「模擬互聯網系統上線過程當中,配置文件回滾場景」