Ứng dụng của Lambda trong Design Patterns (Part 1)
Ở bài viết này tôi muốn giới thiệu cách sử dụng Lambda từ Java 8.0 để tạo ra “Gang of four Design Patterns”: 1. Factory Pattern Ví dụ: một ngân hàng với các sản phẩm là: Loan, Stock và Bond, chúng ta có cách thiết kế pattern như sau khi sử dụng class: ...
Ở bài viết này tôi muốn giới thiệu cách sử dụng Lambda từ Java 8.0 để tạo ra “Gang of four Design Patterns”:
1. Factory Pattern
Ví dụ: một ngân hàng với các sản phẩm là: Loan, Stock và Bond, chúng ta có cách thiết kế pattern như sau khi sử dụng class:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 ); } } } |
Trong đó Loan, Stock, Bond đều được kế thừa từ Product. Như vậy khi muốn tạo ra sản phẩm là Loan ta sẽ gọi như sau:
1 2 3 |
Product p = ProductFactory.createProduct("loan"); |
Với phương pháp Lambda:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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); } |
Giải quyết mọi vấn đề trong Scalable Social Network – Đăng kí ngay!
2. Observer Pattern
Ví dụ: Chúng ta thiết kế một hệ thống để tạo ra thông báo tương tự Twitter. Tức là vài tờ báo (The New York Times, The Guardian) cùng theo dõi feed của new feeds và sẽ nhận được thông báo nếu một tweet chứa keyword cho trước.
Với cách sử dụng class thông thường:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
inteface Observer { void notify(String tweet); } class NYTimes implements Observer { public void notify(String tweet) { if(tweet != null && tweet.contains("happiest")) { System.out.println("Breaking news in NY! " + tweet); } }in } class Guardian implements Observer { public void notify(String tweet) { if(tweet != null && tweet.contains("nice")) { System.out.printlew"Breaking news in Guardian! " + 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)); } } |
Chúng ta có demo việc sử dụng pattern trên như sau:
1 2 3 4 5 6 |
Feed f = new Feed(); f.registerObserver(new NYTimes()); f.registerObserver(new Guardian()); f.notifyObservies("Van is the happiest man in the world"); |
Rõ ràng The New York Times sẽ tiếp nhận được tweet trên.
Với Lambda ta có thể trực tiếp liên kết các observers như sau:
1 2 3 4 5 6 7 8 9 10 11 12 |
f.registerObserver((String tweet) -> { if(tweet != null && tweet.cointains("happiest")) { System.out.println("Breaking news in NY! " + tweet); } }); f.registerObserver((String tweet) -> { if(tweet != null && tweet.cointains("nice")) { System.out.println("Breaking news in Guardian " + tweet); } }); |
Techtalk via Viblo