观察者模式园子里的文章特别多,下面几篇都是不错的,写的也很容易理解。
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!新消息结束!