Lambda 重構面向對象的設計模式

Lambda 重構面向對象的設計模式

策略模式

策略模式包含三部分內容
一個代表某個算法的接口(它是策略模式的接口)。
一個或多個該接口的具體實現,它們代表了算法的多種實現(比如,實體類ConcreteStrategyA或者ConcreteStrategyB)。
一個或多個使用策略對象的客戶

public interface ValidationStrategy { boolean execute(String s); 
}public class IsAllLowerCase implements ValidationStrategy { public boolean execute(String s){ return s.matches("[a-z]+"); } 
} 
public class IsNumeric implements ValidationStrategy { public boolean execute(String s){ return s.matches("\\d+"); } 
}public class Validator{ private final ValidationStrategy strategy; public Validator(ValidationStrategy v){ this.strategy = v;  } public boolean validate(String s){ return strategy.execute(s); } 
} 
Validator numericValidator = new Validator(new IsNumeric()); 
boolean b1 = numericValidator.validate("aaaa"); 
Validator lowerCaseValidator = new Validator(new IsAllLowerCase ()); 
boolean b2 = lowerCaseValidator.validate("bbbb"); 
Validator numericValidator =  new Validator((String s) -> s.matches("[a-z]+")); 
boolean b1 = numericValidator.validate("aaaa"); 
Validator lowerCaseValidator = new Validator((String s) -> s.matches("\\d+")); 
boolean b2 = lowerCaseValidator.validate("bbbb");

Lambda表達式避免了采用策略設計模式時僵化的模板代碼。如果你仔細分 析一下個中緣由,可能會發現,Lambda表達式實際已經對部分代碼(或策略)進行了封裝,而 這就是創建策略設計模式的初衷。因此,我們強烈建議對類似的問題,你應該盡量使用Lambda 表達式來解決

模板方法

讓我們從一個例子著手,看看這個模式是如何工作的。假設你需要編寫一個簡單的在線銀行 應用。通常,用戶需要輸入一個用戶賬戶,之后應用才能從銀行的數據庫中得到用戶的詳細信息, 最終完成一些讓用戶滿意的操作。不同分行的在線銀行應用讓客戶滿意的方式可能還略有不同, 比如給客戶的賬戶發放紅利,或者僅僅是少發送一些推廣文件。你可能通過下面的抽象類方式來 實現在線銀行應用

abstract class OnlineBanking { public void processCustomer(int id){ Customer c = Database.getCustomerWithId(id); makeCustomerHappy(c); }abstract void makeCustomerHappy(Customer c); 
} 

使用Lambda表達式

public void processCustomer(int id, Consumer<Customer> makeCustomerHappy){ Customer c = Database.getCustomerWithId(id); makeCustomerHappy.accept(c); 
} new OnlineBankingLambda().processCustomer(1337, (Customer c) -> System.out.println("Hello " + c.getName()); 

觀察者模式

interface Observer { void notify(String tweet); 
}class NYTimes implements Observer{ public void notify(String tweet) { if(tweet != null && tweet.contains("money")){ System.out.println("Breaking news in NY! " + tweet); } } 
} 
class Guardian implements Observer{ public void notify(String tweet) { if(tweet != null && tweet.contains("queen")){ System.out.println("Yet another news in London... " + tweet); } } 
} 
class LeMonde implements Observer{ public void notify(String tweet) { if(tweet != null && tweet.contains("wine")){ System.out.println("Today cheese, wine and news! " + tweet); } } 
} interface Subject{ void registerObserver(Observer o); void notifyObservers(String tweet); 
} class Feed implements Subject{ private final List<Observer> observers = new ArrayList<>(); public void registerObserver(Observer o) { this.observers.add(o); } public void notifyObservers(String tweet) { observers.forEach(o -> o.notify(tweet)); } 
}Feed f = new Feed(); 
f.registerObserver(new NYTimes()); 
f.registerObserver(new Guardian()); 
f.registerObserver(new LeMonde()); 
f.notifyObservers("The queen said her favourite book is Java 8 in Action!"); 

使用Lambda表達式

f.registerObserver((String tweet) -> { if(tweet != null && tweet.contains("money")){ System.out.println("Breaking news in NY! " + tweet); } 
}); 
f.registerObserver((String tweet) -> { if(tweet != null && tweet.contains("queen")){ System.out.println("Yet another news in London... " + tweet); } 
}); 

那么,是否我們隨時隨地都可以使用Lambda表達式呢?答案是否定的!我們前文介紹的例 子中,Lambda適配得很好,那是因為需要執行的動作都很簡單,因此才能很方便地消除僵化代 碼。但是,觀察者的邏輯有可能十分復雜,它們可能還持有狀態,抑或定義了多個方法,諸如此 類。在這些情形下,你還是應該繼續使用類的方式

責任鏈模式

通常,這種模式是通過定義一個代表處理對象的抽象類來實現的,在抽象類中會定義一個字 段來記錄后續對象。一旦對象完成它的工作,處理對象就會將它的工作轉交給它的后繼。代碼中, 這段邏輯看起來是下面這樣

public abstract class ProcessingObject<T> { protected ProcessingObject<T> successor; public void setSuccessor(ProcessingObject<T> successor){ this.successor = successor;} public T handle(T input){ T r = handleWork(input); if(successor != null){ return successor.handle(r); } return r; } abstract protected T handleWork(T input); 
} public class HeaderTextProcessing extends ProcessingObject<String> { public String handleWork(String text){ return "From Raoul, Mario and Alan: " + text; } 
} 
public class SpellCheckerProcessing extends ProcessingObject<String> { public String handleWork(String text){ return text.replaceAll("labda", "lambda"); } 
} ProcessingObject<String> p1 = new HeaderTextProcessing(); 
ProcessingObject<String> p2 = new SpellCheckerProcessing(); 
p1.setSuccessor(p2);
String result = p1.handle("Aren't labdas really sexy?!!"); 
System.out.println(result); 

使用Lambda表達式

UnaryOperator<String> headerProcessing =  (String text) -> "From Raoul, Mario and Alan: " + text;
UnaryOperator<String> spellCheckerProcessing =  (String text) -> text.replaceAll("labda", "lambda"); 
Function<String, String> pipeline =  headerProcessing.andThen(spellCheckerProcessing); 
String result = pipeline.apply("Aren't labdas really sexy?!!")

工廠模式

public class ProductFactory { public static Product createProduct(String name){ switch(name){ case "loan": return new Loan(); case "stock": return new Stock(); case "bond": return new Bond(); default: throw new RuntimeException("No such product " + name); } } 
} 
Product p = ProductFactory.createProduct("loan"); 

使用Lambda表達式

final static Map<String, Supplier<Product>> map = new HashMap<>(); 
static { map.put("loan", Loan::new); map.put("stock", Stock::new); map.put("bond", Bond::new); 
} public static Product createProduct(String name){ Supplier<Product> p = map.get(name); if(p != null) return p.get(); throw new IllegalArgumentException("No such product " + name); 
} 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167082.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167082.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167082.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java集成poi框架

介紹 : Apache POI是Apache軟件基金會的開放源碼函式庫&#xff0c;POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。 下面簡單介紹一下如何使用該框架&#xff1a; 一&#xff1a;導入依賴 <!-- excel解析依賴--><dependency><groupId&…

17 redis集群方案

1、RedisCluster分布式集群解決方案 為了解決單機內存&#xff0c;并發等瓶頸&#xff0c;可使用此方案解決問題. Redis-cluster是一種服務器Sharding技術&#xff0c;Redis3.0以后版本正式提供支持。 這里的集群是指多主多從&#xff0c;不是一主多從。 2、redis集群的目標…

pair和typedef

文章目錄 一、pair用法1.2、pair的創建和初始化1.3、pair對象的操作1.4、(make_pair)生成新的pair對象1.5、通過tie獲取pair元素值 2、typedef2.1、什么是typedef2.2、typedef用法2.2.1、對于數據類型使用例如&#xff1a;2.2.2、對于指針的使用例如2.2.3、對于結構體的使用 2.…

java springboot測試類虛擬MVC環境 匹配返回值與預期內容是否相同 (JSON數據格式) 版

上文java springboot測試類鑒定虛擬MVC請求 返回內容與預期值是否相同我們講了測試類中 虛擬MVC發送請求 匹配返回內容是否與預期值相同 但是 讓我意外的是 既然沒人罵我 因為我們實際開發 返回的基本都是json數據 字符串的接口場景是少數的 我們在java文件目錄下創建一個 dom…

2023年10月紙巾市場分析(京東天貓淘寶平臺紙巾品類數據采集)

雙十一大促期間&#xff0c;剛需品的紙巾是必囤商品之一。今年雙十一&#xff0c;京東數據顯示&#xff0c;10月23日至29日&#xff0c;清潔紙品成交額同比增長40%&#xff0c;由此也拉動了10月紙巾市場的銷售。 鯨參謀數據顯示&#xff0c;今年10月&#xff0c;京東平臺紙巾市…

【日常總結】如何禁止瀏覽器 http自動跳轉成https

一、場景 二、問題 三、解決方案 3.1 chrome 瀏覽器 3.2 edge 瀏覽器&#xff1a; 3.3 Safari 瀏覽器 3.4 Firefox 瀏覽器 3.5 Microsoft Edge 一、場景 公司網站 http:// 谷歌瀏覽器中自動轉換成 https:// 導致無法訪問 二、問題 nginx配置ssl 443接口&#xff0c; ht…

SOLIDWORKS 2024新功能之Electrical篇

SOLIDWORKS 2024 Electrical篇目錄概覽 ? 對齊零部件 ? 更改多個導軌和線槽的長度 ? 過濾輔助和附件零件 ? 2D 機柜中的自動零件序號 ? 移除制造商零件數據 ? 重置未定義的宏變量 ? 使用范圍縮短列表 ? SOLIDWORKS Electrical Schematic 增強功能 1、對齊零部件…

ONNX實踐系列-修改yolov5-seg的proto分支輸出shape

一、目標 本文主要介紹要將原始yolov5分割的輸出掩膜從[b,c,h,.w]修改為[b, h, w, c] 原來的: 目標的: 代碼如下: Descripttion: version: @Company: WT-XM Author: yang jinyi Date: 2023-09-08 11:26:28 LastEditors: yang jinyi LastEditTime: 2023-09-08 11:48:01 …

Threejs_14 制作圣誕賀卡

繼續跟著老陳打碼學習&#xff01;&#xff01;&#xff01;支持&#xff01;&#xff01;&#xff01; 效果圖 鏈接&#xff1a;https://pan.baidu.com/s/1Ft8U2HTeqmpyAeesL31iUg 提取碼&#xff1a;6666 使用到的 模型文件和資源等都為老陳打碼提供&#xff01;&#x…

【騰訊云云上實驗室】探索保護數據之盾背后的安全監控機制

當今數字化時代&#xff0c;數據安全成為了企業和個人最為關注的重要議題之一。隨著數據規模的不斷增長和數據應用的廣泛普及&#xff0c;如何保護數據的安全性和隱私性成為了迫切的需求。 今天&#xff0c;我將帶領大家一起探索騰訊云云上實驗室所推出的向量數據庫&#xff0c…

新版PY系列離線燒錄器,支持PY002A/002B/003/030/071等MCU各封裝,不同 FLASH 大小型號

PY系列離線燒錄器&#xff0c;目前支持PY32F002A/002B/002/003/030/071/072/040/403/303 各封裝、不同 FLASH 大小型號。PY離線燒錄器需要搭配上位機軟件使用&#xff0c;上位機軟件可以在芯嶺技術官網上下載&#xff0c;還包括了離線燒錄器的使用說明。PY離線燒錄器使用MINI U…

金融機構如何高效率考勤?這個技巧幫了大忙!

在現代社會&#xff0c;隨著科技的不斷發展&#xff0c;人臉識別技術作為一種高效、便捷的身份驗證手段&#xff0c;逐漸應用于各個領域&#xff0c;其中之一便是人臉考勤系統。 傳統的考勤方式存在一系列問題&#xff0c;如卡片打卡容易被冒用、簽到表容易造假等&#xff0c;而…

CTFUB-web前置技能-HTTP協議

burp抓包,抓第二次的 修改請求方式為CTFHUB

算法筆記:OPTICS 聚類

1 基本介紹 OPTICS(Ordering points to identify the clustering structure)是一基于密度的聚類算法 OPTICS算法是DBSCAN的改進版本 在DBCSAN算法中需要輸入兩個參數&#xff1a; ? 和 MinPts &#xff0c;選擇不同的參數會導致最終聚類的結果千差萬別&#xff0c;因此DBCSAN…

線上PDF文件展示

場景&#xff1a; 請求到的PDF&#xff08;url鏈接&#xff09;&#xff0c;將其展示在頁面上 插件&#xff1a; pdfobject &#xff08;我使用的版本&#xff1a; "pdfobject": "^2.2.12" &#xff09; 下載插件就不多說了&#xff0c;下面將其引入&a…

【Clang Static Analyzer 代碼靜態檢測工具詳細使用教程】

Clang Static Analyzer sudo apt-get install clang-tools scan-build cmake .. scan-build make -j4 編譯完成之后會在終端提示在哪里查看報錯文檔: scan-build: 55 bugs found. scan-build: Run scan-view /tmp/scan-build-2023-11-24-150637-6472-1 to examine bug report…

Liunx Ubuntu Server 安裝配置 Docker

1. 安裝Docker 1.1 更新軟件包列表 sudo apt update1.2 添加Docker存儲庫 sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-a…

Django QuerySet.order_by SQL注入漏洞(CVE-2021-35042)

漏洞描述 Django 于 2021年7月1日發布了一個安全更新&#xff0c;修復了函數QuerySet.order_by中的 SQL 注入漏洞。 參考鏈接&#xff1a; Django security releases issued: 3.2.5 and 3.1.13 | Weblog | Django 該漏洞需要開發人員使用order_by功能。此外&#xff0c;還可…

加入華為云鯤鵬極簡開發創造營,激活創造力,探索無限可能!

數字經濟時代&#xff0c;速度、效率、質量安全已成為各行業告訴拓新發展的關鍵&#xff0c;華為云不斷打磨敏捷安全開發的軟件平臺&#xff0c;為更高效率的生產力變革積蓄能量。 在剛剛過去不久的2023華為全聯接大會上&#xff0c;華為最新發布了華為云CodeArts與鯤鵬DevKit…

關于配置文件中秘鑰信息加密實現方案的一些思考

關于配置文件中秘鑰信息加密實現方案的一些思考 背景實現方案 背景 配置信息文件中(代碼中), 不應該有明文的秘鑰信息. 需要找一種方案去做加密處理. 實現方案 我們可以在項目指定目錄上傳一份加密/解密程序, 例如: jasypt-gui.jar. 啟動時: 配置JVM參數, 對加密的信息進行解…