观察者模式

定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。类似发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息

四种角色:抽象被观察者角色  抽象观察者角色  具体被观察者角色  具体观察者角色

 

小Demo走一波

 

1、定义Observer

public interface Observer {

    public void notify(String info);
}

2、定义Observer实现

public class ObserverImpl implements Observer{

    private SubjectImpl subject;
    private String observerName;
    
    //注册感兴趣的subject
    public ObserverImpl(SubjectImpl subject, String observerName) {
        this.subject = subject;
        this.observerName = observerName;
        subject.register(this);
    }

    //打印接收到消息
    @Override
    public void notify(String info) {
        System.out.println("observer " + this.observerName + " receive data: " + info);
    }

}

 

3、定义Subject

public interface Subject {

    /**
     * register observer
     */
    public void register(Observer obj);
    
    /**
     * remove observer
     */
    public void remove(Observer obj);
    
    public void notifyIfObserverChange();
    
}

 

4、subject实现

 

public class SubjectImpl implements Subject{

    private ArrayList<Observer> observerList = new ArrayList<Observer>();
    private String info;
    
    @Override
    public void register(Observer obj) {
        observerList.add(obj);
    }

    @Override
    public void remove(Observer obj) {
        int i = observerList.indexOf(obj);
        if(i > 0)
            observerList.remove(i);
    }

    @Override
    public void notifyIfObserverChange() {
        for (int i = 0, len = observerList.size(); i < len; i++) {
            Observer instance = (Observer)observerList.get(i);
            instance.notify(info);
        }
    }

    public void setWork(String _info) {
        this.info = _info;
        System.out.println("send data: " + info);
        this.notifyIfObserverChange();
    }
}

 

 

5、测试

public class Main {

    public static void main(String[] args) {
        
        SubjectImpl sub = new SubjectImpl();
        new ObserverImpl(sub, "t1");
        new ObserverImpl(sub, "t2");
        new ObserverImpl(sub, "t3");
        
        sub.setWork("123");
    }
}

 

posted @ 2018-05-15 13:58  秋水秋色  阅读(178)  评论(0编辑  收藏  举报