觀察者模式園子裏的文章特別多,下面幾篇都是不錯的,寫的也很容易理解。html
http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.htmljava
http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html服務器
定義:ide
觀察者模式是對象的行爲模式,又叫發佈-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。測試
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知全部觀察者對象,使它們可以自動更新本身。spa
熟能生效,觀察者模式既然很是適合於發佈訂閱這種場景,就使用這種場景來寫一個例子增長對觀察者模式的理解。類圖以下:code
一、先定義郵件的類,也就是觀察者server
先定義郵件接口,此接口只有一個更新的方法,用於接收更新的郵件訂閱:htm
public interface IMail { public void updateMail(String str); }
該接口的實現:對象
在更新訂閱的時候,打印該郵箱主人的名稱+更新內容。
public class Mail implements IMail { private String mUserName; public Mail(String name) { mUserName=name; } @Override public void updateMail(String str) { System.out.print(mUserName+"收到新消息:"); System.out.print(str); System.out.println("新消息結束!"); } }
二、定義郵件服務器類,也就是主體(被觀察者)。
先定義一個IMailServer接口:
public interface IMailServer { public void add(IMail mail); public void remove(IMail mail); public void notifyChange(String str); }
該接口的實現類:
public class MailServer implements IMailServer { private List<IMail> mailList=new ArrayList<IMail>(); @Override public void add(IMail mail) { mailList.add(mail); } @Override public void remove(IMail mail) { mailList.remove(mail); } @Override public void notifyChange(String str) { for(IMail mail : mailList){ mail.updateMail(str); } } }
三、測試類以及結果:
public class TestObserver { /** * @param args */ public static void main(String[] args) { //server IMailServer mailServer=new MailServer(); //three mail client IMail mail1=new Mail("張三"); IMail mail2=new Mail("李四"); IMail mail3=new Mail("王五"); mailServer.add(mail1); mailServer.add(mail2); mailServer.add(mail3); mailServer.notifyChange("there is 3 new mail,to update client mail!"); } }
運行結果:
張三收到新消息:there is 3 new mail,to update client mail!新消息結束! 李四收到新消息:there is 3 new mail,to update client mail!新消息結束! 王五收到新消息:there is 3 new mail,to update client mail!新消息結束!