您的位置:首页 > 其它

设计模式-----观察者模式(Obsever)

2015-10-01 11:56 435 查看
它定义了对象之间一对多的依赖关系。因此,。当一个对象的状态变化,对吸毒成瘾者,他将收到通知和更新自己主动。

观察者模式的组成:

抽象主题角色:把全部对观察者对象的引用保存在一个集合中。抽象主题提供一个接口。能够添加和删除观察者角色。

详细主题角色:在详细主题内部状态改变时,给全部登记过的观察者发出通知。

抽象观察者角色:为全部详细的观察者定义一个接口,在得到主题的通知时更新自己。

详细观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。

观察者模式UML图:






[b]观察者模式演示样例代码:

[/b]

[b]主题接口类 Subject.java

[/b]



public interface Subject {
public void addObserver(Observer observer);

public void removeObserver(Observer observer);

public void notifyObservers(String str);
}


[b]详细主题类(能够实现多个) ConcreteSubject[b].java

[/b][/b]



import java.util.ArrayList;

public class ConcreteSubject implements Subject {
ArrayList<Observer> observers = new ArrayList<Observer>();

public void addObserver(Observer observer) {
observers.add(observer);
}

public void removeObserver(Observer observer) {
observers.remove(observer);
}

@Override
public void notifyObservers(String str) {
//通知全部观察者
for (Observer o : observers) {
o.update(str);
}
}
}


[b]观察者接口类 Observer[b].java

[/b][/b]



public interface Observer {
public void update(String str);
}


[b]详细观察者类[b](能够实现多个)ConcreteObserver.java

[/b][/b]



public class ConcreteObserver implements Observer {

@Override
public void update(String str) {
System.out.println("通知了observer--》 " + str);
}
}


測试类 Test.java



/**
* 測试观察者模式
*
* @author neng
*
*/
public class Test {

public static void main(String[] args) {
// 仅仅要是实现接口的观察者与主题就可以. 多对多
ConcreteObserver observer1 = new ConcreteObserver();
ConcreteObserver observer2 = new ConcreteObserver();

ConcreteSubject concreteSubject1 = new ConcreteSubject();

concreteSubject1.addObserver(observer1);
concreteSubject1.addObserver(observer2);
concreteSubject1.notifyObservers("这个是消息!

!!

。");

concreteSubject1.removeObserver(observer2);
concreteSubject1.notifyObservers("命令!

。");
}

}


观察者模式用途:

[b][b]Android。ios中的Notification即用观察者模式实现。

Java中的事件监听也用观察者模式实现。

[/b][/b]

[b][b]多个对象(一对多,多对多)之间通讯能够用观察者模式,主题和观察者之间的耦合度非常低,可拓展性非常强!

[/b][/b]



[b]转载请注明出处:http://blog.csdn.net/xn4545945

[/b]



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: