package com.itranswarp.learnjava.observer;
public class Product {
private String name;
private double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return String.format("{Product: name=%s, price=%s}", name, price);
}
}
package com.itranswarp.learnjava.observer;
public interface ProductObservable {
}
package com.itranswarp.learnjava.observer;
public interface ProductObserver {
void onPublished(Product product);
void onPriceChanged(Product product);
}
package com.itranswarp.learnjava.observer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Store {
private List<ProductObserver> observers = new ArrayList<>();
private Map<String, Product> products = new HashMap<>();
public void addObserver(ProductObserver observer) {
this.observers.add(observer);
}
public void removeObserver(ProductObserver observer) {
this.observers.remove(observer);
}
public void addNewProduct(String name, double price) {
Product p = new Product(name, price);
products.put(p.getName(), p);
observers.forEach(o -> o.onPublished(p));
}
public void setProductPrice(String name, double price) {
Product p = products.get(name);
p.setPrice(price);
observers.forEach(o -> o.onPriceChanged(p));
}
}
package com.itranswarp.learnjava;
import com.itranswarp.learnjava.observer.Product;
import com.itranswarp.learnjava.observer.ProductObserver;
import com.itranswarp.learnjava.observer.Store;
/**
* Learn Java from https://www.liaoxuefeng.com/
*
* @author liaoxuefeng
*/
public class Main {
public static void main(String[] args) {
// observer:
Admin a = new Admin();
Customer c = new Customer();
// store:
Store store = new Store();
// register:
store.addObserver(a);
store.addObserver(c);
// 注册匿名观察者:
store.addObserver(new ProductObserver() {
@Override
public void onPublished(Product product) {
System.out.println("[Log] on product published: " + product);
}
@Override
public void onPriceChanged(Product product) {
System.out.println("[Log] on product price changed: " + product);
}
});
// operation:
store.addNewProduct("Design Patterns", 35.6);
store.addNewProduct("Effective Java", 50.8);
store.setProductPrice("Design Patterns", 31.9);
}
}
class Customer implements ProductObserver {
@Override
public void onPublished(Product product) {
System.out.println("[Customer] on product published: " + product);
}
@Override
public void onPriceChanged(Product product) {
System.out.println("[Customer] on product price changed: " + product);
}
}
class Admin implements ProductObserver {
@Override
public void onPublished(Product product) {
System.out.println("[Admin] on product published: " + product);
}
@Override
public void onPriceChanged(Product product) {
System.out.println("[Admin] on product price changed: " + product);
}
}