觀察者(Observer)模式 也能夠成爲發佈訂閱模式,此模式是對象之間的模式,對象之間呈現一種一對多的關係。其中的一是被觀察者,可能是觀察者,故被觀察者不能產生多個對象,只能有一個對象供觀察者觀察,因此在寫被觀察者的時候,須要使用到單例模式。java
那麼咱們能夠經過代碼來很直觀的理解觀察者模式ide
package observer; import java.util.ArrayList; import java.util.List; import java.util.Observable; import java.util.Observer; //被觀察者--產品列表 public class Products extends Observable { //產品列表 private List<String> proList = null; private static Products instance; //類惟一的實例(使用單例模式) private Products() { } //單例模式-獲取列表對象 public static Products getInstance() { if(instance == null) { instance = new Products(); instance.proList = new ArrayList<>(); } return instance; } /** * 增長觀察者(電商接口) * @param observer 觀察者 */ public void addProductsObserver(Observer observer) { this.addObserver(observer); } /** * 新增產品(被觀察者) * @param newProduct 新產品 */ public void addProduct(String newProduct) { if(newProduct==null || "".equals(newProduct)) { System.out.println("未新增產品或新增產品爲空!"); }else { System.out.println("目前產品列表中有:"+proList.size()+"個產品!"); //新增產品 proList.add(newProduct); System.out.println("產品列表中新增了產品:"+newProduct); System.out.println("目前產品列表中有:"+proList.size()+"個產品!"); //設置被觀察者對象發生了變化(告知觀察者,產品列表發生了變化) this.setChanged(); //通知觀察者,並傳遞新產品 this.notifyObservers(newProduct); } } }
package observer; import java.util.Observable; import java.util.Observer; //觀察者1-京東商城接口 public class JDObserver implements Observer { /** * 京東觀察者接口 * 1.Observable 被觀察者 * 2.product 產品 */ @Override public void update(Observable o, Object product) { Products pro = (Products) o; System.out.println("被觀察者:"+ pro); String newProduct = (String) product; System.out.println("同步新產品【"+newProduct+"]到京東商城!"); } }
package observer; import java.util.Observable; import java.util.Observer; //觀察者 public class TaoBaoObserver implements Observer { /** * 淘寶觀察者接口 * 1.Observable 被觀察者 * 2.product 產品 */ @Override public void update(Observable o, Object product) { Products pro = (Products) o; System.out.println("被觀察者:"+ pro); String newProduct = (String) product; System.out.println("同步新產品【"+newProduct+"]到京東商城!"); } }
結果展現中,咱們經過在列表中新增一個產品,而後來觀察者和被觀察者之間的變化,執行代碼可獲得如下結果:測試