设计模式之观察者模式

来源:互联网 发布:js数字滚动抽奖 编辑:程序博客网 时间:2024/05/17 16:45

观察者模式,又称发布-订阅模式,是软件开发常用设计模式的一种。观察者模式,定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

让我们来分析一下代码:

Subject.java 观察者注册删除的接口

package com.obaniu;/** * @author Obaniu * @since 2011-10-31 * @version 1.0 *  */public interface Subject {// 注册观察者public void registerObserver(Observer o);// 删除观察者public void removeObserver(Observer o);// 通知观察者public void notifyObservers();}
 Observer.java  观察者接口
package com.obaniu;/** * @author Obaniu * @since 2011-10-31 * @version 1.0 * */public interface Observer {    //用来更新信息public void update(String msg);}
DisplayElement.java 信息显示接口
package com.obaniu;public interface DisplayElement {    //用来显示接受到的信息public void display(); }
DisplayElement.java 信息显示接口
package com.obaniu;public interface DisplayElement {    //用来显示接受到的信息public void display(); }
 MyMessage.java  实现 Subject

package com.obaniu;import java.util.ArrayList;/** * 实现Subject接口 * @author Obaniu * @since 2011-10-31 * @version 1.0 */public class MyMessage implements Subject {private ArrayList list;private String msg;    public MyMessage(){list = new ArrayList();}@Overridepublic void registerObserver(Observer o) {// TODO Auto-generated method stublist.add(o);}@Overridepublic void removeObserver(Observer o) {// TODO Auto-generated method stubint i = list.indexOf(o);if (i >= 0) {list.remove(i);}}@Overridepublic void notifyObservers() {// TODO Auto-generated method stubfor (int i = 0; i < list.size(); i++) {            Observer observer = (Observer) list.get(i);            observer.update(msg);}}    public void setMessage(String message){this.msg = message;messageChanged();}private void messageChanged() {// TODO Auto-generated method stubnotifyObservers();}}
CurrentConditionDisplay.java

/** *  */package com.obaniu;/** * @author Obaniu * @since 2011-10-31 * */public class CurrentConditionsDisplay implements Observer, DisplayElement {    private Subject subject;private String msg;public CurrentConditionsDisplay(Subject subject){this.subject = subject;subject.registerObserver(this);}/* (non-Javadoc) * @see com.obaniu.DisplayElement#display() */@Overridepublic void display() {// TODO Auto-generated method stub        System.out.println("接受到的消息:"+msg);}/* (non-Javadoc) * @see com.obaniu.Observer#update(java.lang.String) */@Overridepublic void update(String msg) {// TODO Auto-generated method stub        this.msg = msg;        display();}}
编写测试类Test.java

package com.obaniu;public class Test {public static void main(String[] args) { MyMessage myMessage = new MyMessage();CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(myMessage);for (int i = 0; i < 10; i++) {myMessage.setMessage(">>>>>>>>>>>>>>>>>" + i);}}}
在控制台上打印信息:

接受到的消息:>>>>>>>>>>>>>>>>>0接受到的消息:>>>>>>>>>>>>>>>>>1接受到的消息:>>>>>>>>>>>>>>>>>2接受到的消息:>>>>>>>>>>>>>>>>>3接受到的消息:>>>>>>>>>>>>>>>>>4接受到的消息:>>>>>>>>>>>>>>>>>5接受到的消息:>>>>>>>>>>>>>>>>>6接受到的消息:>>>>>>>>>>>>>>>>>7接受到的消息:>>>>>>>>>>>>>>>>>8接受到的消息:>>>>>>>>>>>>>>>>>9



原创粉丝点击