摘要:觀察者模式觀察者模式也可以成為發(fā)布訂閱模式,此模式是對象之間的模式,對象之間呈現(xiàn)一種一對多的關(guān)系。其中的一是被觀察者,多是觀察者,故被觀察者不能產(chǎn)生多個(gè)對象,只能有一個(gè)對象供觀察者觀察,所以在寫被觀察者的時(shí)候,需要使用到單例模式。
觀察者(Observer)模式
觀察者(Observer)模式 也可以成為發(fā)布訂閱模式,此模式是對象之間的模式,對象之間呈現(xiàn)一種一對多的關(guān)系。其中的一是被觀察者,多是觀察者,故被觀察者不能產(chǎn)生多個(gè)對象,只能有一個(gè)對象供觀察者觀察,所以在寫被觀察者的時(shí)候,需要使用到單例模式。
代碼理解那么我們可以通過代碼來很直觀的理解觀察者模式
package observer; import java.util.ArrayList; import java.util.List; import java.util.Observable; import java.util.Observer; //被觀察者--產(chǎn)品列表 public class Products extends Observable { //產(chǎn)品列表 private ListproList = null; private static Products instance; //類唯一的實(shí)例(使用單例模式) 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); } /** * 新增產(chǎn)品(被觀察者) * @param newProduct 新產(chǎn)品 */ public void addProduct(String newProduct) { if(newProduct==null || "".equals(newProduct)) { System.out.println("未新增產(chǎn)品或新增產(chǎn)品為空!"); }else { System.out.println("目前產(chǎn)品列表中有:"+proList.size()+"個(gè)產(chǎn)品!"); //新增產(chǎn)品 proList.add(newProduct); System.out.println("產(chǎn)品列表中新增了產(chǎn)品:"+newProduct); System.out.println("目前產(chǎn)品列表中有:"+proList.size()+"個(gè)產(chǎn)品!"); //設(shè)置被觀察者對象發(fā)生了變化(告知觀察者,產(chǎn)品列表發(fā)生了變化) this.setChanged(); //通知觀察者,并傳遞新產(chǎn)品 this.notifyObservers(newProduct); } } }
package observer; import java.util.Observable; import java.util.Observer; //觀察者1-京東商城接口 public class JDObserver implements Observer { /** * 京東觀察者接口 * 1.Observable 被觀察者 * 2.product 產(chǎn)品 */ @Override public void update(Observable o, Object product) { Products pro = (Products) o; System.out.println("被觀察者:"+ pro); String newProduct = (String) product; System.out.println("同步新產(chǎn)品【"+newProduct+"]到京東商城!"); } }
package observer; import java.util.Observable; import java.util.Observer; //觀察者 public class TaoBaoObserver implements Observer { /** * 淘寶觀察者接口 * 1.Observable 被觀察者 * 2.product 產(chǎn)品 */ @Override public void update(Observable o, Object product) { Products pro = (Products) o; System.out.println("被觀察者:"+ pro); String newProduct = (String) product; System.out.println("同步新產(chǎn)品【"+newProduct+"]到京東商城!"); } }結(jié)果測試
結(jié)果展示中,我們通過在列表中新增一個(gè)產(chǎn)品,然后來觀察者和被觀察者之間的變化,執(zhí)行代碼可得到以下結(jié)果:
新增一個(gè)產(chǎn)品: 產(chǎn)品為空:文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/69627.html
摘要:觀察者模式面向的需求是對象觀察者對對象被觀察者的某種變化高度敏感,需要在變化的一瞬間做出反應(yīng)。規(guī)定,當(dāng)不會(huì)再有新的發(fā)出時(shí),需要觸發(fā)方法作為標(biāo)志。在事件處理過程中出異常時(shí),會(huì)被觸發(fā),同時(shí)隊(duì)列自動(dòng)終止,不允許再有事件發(fā)出。 我從去年開始使用 RxJava ,到現(xiàn)在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的 Android 項(xiàng)目也在使用 RxJava ,并且使...
摘要:再獲取其事件屬性,我們這里只簡單地獲取屬性,我們將它的屬性值和元素標(biāo)識保存到中最后等待模版掛載在元素中后,我們遍歷數(shù)組,掛載事件至此,我的已基本實(shí)現(xiàn)了實(shí)現(xiàn)的是一個(gè)簡單的計(jì)數(shù)器有興趣的小伙伴可以復(fù)制以下代碼運(yùn)行查看效果 這周參考了一些博文,自己寫了一個(gè)簡單的vue,網(wǎng)上這類實(shí)現(xiàn)很多,我的實(shí)現(xiàn)也沒什么新奇,權(quán)當(dāng)一個(gè)自我練習(xí)吧 本文同時(shí)發(fā)在我的github博客上,歡迎star 具體實(shí)現(xiàn) 首先...
摘要:在沒有環(huán)境下對進(jìn)行單元測試的時(shí)候,應(yīng)用邏輯正確性是無法驗(yàn)證的更新的時(shí)候,無法對的更新操作進(jìn)行斷言。對是通過接口進(jìn)行,在對進(jìn)行不依賴環(huán)境的單元測試的時(shí)候。這里根據(jù)上面的例子給出了的單元測試樣例。年微軟工程師在自己的博客上首次公布了模式。 前言 做客戶端開發(fā)、前端開發(fā)對MVC、MVP、MVVM這些名詞不了解也應(yīng)該大致聽過,都是為了解決圖形界面應(yīng)用程序復(fù)雜性管理問題而產(chǎn)生的應(yīng)用架構(gòu)模式。網(wǎng)上...
閱讀 841·2019-08-30 15:54
閱讀 450·2019-08-30 12:51
閱讀 2037·2019-08-29 16:28
閱讀 2854·2019-08-29 16:10
閱讀 2341·2019-08-29 14:21
閱讀 419·2019-08-29 14:09
閱讀 2140·2019-08-23 16:13
閱讀 1245·2019-08-23 13:59