【設計模式】郵件訂閱類——觀察者模式

 觀察者模式園子裏的文章特別多,下面幾篇都是不錯的,寫的也很容易理解。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!新消息結束!
相關文章
相關標籤/搜索