Java设计模式《十》观察者模式

来源:互联网 发布:苹果软件图标不见了 编辑:程序博客网 时间:2024/06/02 21:15
//观察者模式定义了一种一对多的依赖关系 让多个观察者对象同时监听某一个主题//这个主题对象在状态发生变化时,会通知所有观察者对象 是它们自动更新自己//观察者模式中抽象通知者依赖抽象观察者 且每一个具体观察者不一定都是要调用update()方法//使用委托 通知者和观察者可以互补知道 有客户端来决定通知谁可以处理上面的问题

抽象观察者类

//抽象观察者得到通知者的通知及时更新自己public abstract class Observer{    public abstract void update();}

具体的观察者类

//具体的观察者类public class ConcreteObserver extends Observer{    private String name;    private String observerState;    private ConcreteSubject subject;    public ConcreteSubject getSubject(){        retrun subject;    }    public void setSubject(ConcreteSubject subject){        this.subject = subject;    }    public ConcreteObserver(ConcreteSubject subject,String name){        this.subject =subject;        this.name=name;    }    public void update(){        observerState=subject.getSubjectState();        System.out.prinltn(name+""+observerState);    }}

抽象通知者

//抽象通知者提供一个借口 可以增加删除和通知观察则对象public abstract class Subject{    private List<Observer> observers = new ArrayList<Observer>();    public void attach(Observer observer){        observers.add(observer)    }    public void detach(Observer observer){        observers.remove(observer);    }    public void noticeAll(){        Iterator<Observer> iterator = observers.iterator();        while(iterator.hasNext()){            iterator.next().update();                   }    }}

具体的观察者

//具体通知者将有关状态存入具体观察者对象 在具体通知者内部状态改变时 给登记过的观察扎发出通知public class ConcreteSubject extends Subject{    private String subjectState;    public String getSubjectState(){        return subjectState;    }    public void setSubjectState(){        this.subjectState=subjectState;    }}

测试案例

//观察者模式定义了一种一对多的依赖关系 让多个观察者对象同时监听某一个主题//这个主题对象在状态发生变化时,会通知所有观察者对象 是它们自动更新自己//观察者模式中抽象通知者依赖抽象观察者 且每一个具体观察者不一定都是要调用update()方法//使用委托 通知者和观察者可以互补知道 有客户端来决定通知谁可以处理上面的问题public class TestObserver{    public static void main(String[] args){        ConcreteSubject s = new ConcreteSubject();        s.attach(new ConcreteObserver(s, "X"));        s.attach(new ConcreteObserver(s, "Y"));        s.setSubjectState("aaa");        s.noticeAll();    }}
0 0