fred-ye / summary

my blog
43 stars 9 forks source link

[Design-Pattern]-Observer #1

Open fred-ye opened 10 years ago

fred-ye commented 10 years ago

观察者模式:定义了对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知并进行相应的操作。
两个角色主题观察者,它们之间是一对多的关系。在主题中包含有注册移除观察者的操作和通知观察者状态变化的操作。观察者中会有相应的响应方法,用于在接收到通知后执行。
代码:

public interface Subject {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObservers();
}
public interface Observer {
    public void execute(); //execute方法可以根据需要定义相关的传入参数,将主题中的数据传给观察者。
}
public class ConcretSubject implements Subject{
    private ArrayList<Observer> observerList;

    public ConcretSubject() {
        observerList = new ArrayList<Observer>();
    }

    @Override
    public void registerObserver(Observer o) {
        observerList.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        observerList.remove(o);             
    }

    @Override
    public void notifyObservers() {
        for(Observer observer : observerList) {
            observer.execute();
        }        
    }
}
public class ConcretObserver implements Observer{
    @Override
    public void execute() {
        System.out.println("Observer execute.....");        
    }
}

*一个测试类

public class TestObserver {
    public static void main(String args []) {
        Subject subject = new ConcretSubject();
        Observer observer = new ConcretObserver();
        subject.registerObserver(observer);
        subject.notifyObservers();        
    }
}

还记得以前学Java awt/swing的时候,接触到的事件监听模型,和观察者多少有些类似,也写在下面:

import java.util.EventListener;
import java.util.EventObject;

public class EventTest {
    public static void main(String args[]) {
        ConcretEventSource e = new ConcretEventSource();
        e.setEventListener(new ConcretListener());
        e.fireEvent();
    }
}

// 事件
class ConcretEvent extends EventObject {
    public ConcretEvent(Object source) {
        super(source);
    }
}

// 监听者
class ConcretListener implements EventListener {
    // 监听器的行为,传进来的参数是事件对象
    public void listenerBehave(EventObject e) {
        ConcretEventSource source = (ConcretEventSource) e.getSource();
        System.out.println("listener execute");
    }
}

// 事件源对象
class ConcretEventSource {
    ConcretListener listener;

    public void setEventListener(ConcretListener listener) {
        this.listener = listener;
    }

    public void fireEvent() {
        ConcretEvent e = new ConcretEvent(this);
        System.out.println("发出一个事件");
        listener.listenerBehave(e);
    }
}