【设计模式】邮件订阅类——观察者模式

 观察者模式园子里的文章特别多,下面几篇都是不错的,写的也很容易理解。

http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html

http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html

定义:

观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

熟能生效,观察者模式既然非常适合于发布订阅这种场景,就使用这种场景来写一个例子增加对观察者模式的理解。类图如下:

 

1、先定义邮件的类,也就是观察者

先定义邮件接口,此接口只有一个更新的方法,用于接收更新的邮件订阅:

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("新消息结束!");
    }
}

2、定义邮件服务器类,也就是主体(被观察者)。

先定义一个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);
        }
    }
}

3、测试类以及结果:

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!新消息结束!
原文地址:https://www.cnblogs.com/xiajf/p/4184204.html