您的位置:首页 > 其它

设计模式学习二之观察者模式1

2015-11-11 23:30 369 查看
  观察者模式可谓是我们用的最多的模式之一了,如果开发过界面程序的话,各种监听事件,setOnClickListener(),设置点击的监听事件,这里就是一个观察者模式的应用了。观察者模式是什么呢?是一个一对多得依赖,一个主题,多个订阅者,就像报纸在报社和读者间的关系一样,读者通过给报社交钱告诉报社我需要你得报纸,报社分发报纸的时候,对所有交钱了得读者一一派发报纸。

  怎么实现呢?考虑接口的应用,以及List容器的使用等。

  

主题接口,相当于报社
package com.csshu;

主题接口,具有注册观察者和移除观察者方法
public interface mysubject {
public void registerObserver(myobserver o);
public void removeObserver(myobserver o);

}
这里需要提供注册(交钱)和取消(相当于读者不想继续订阅报纸了)这两个方法,没错
这些方法需要在主题(报社)里面实现,而观察者(读者)需要去调用,下面有分享。

观察者接口
package com.csshu;

public interface myobserver {
public void update(int a,int b,int c);
}

这里是观察者1的实现,
package com.csshu;

public class Observer implements myobserver {

@Override
public void update(int a, int b, int c) {
System.out.println(a+"---one,"+b+"---"+c);
}

}

第二个观察者,
package com.csshu;

public class Observer2 implements myobserver {

@Override
public void update(int a, int b, int c) {
System.out.println(a+"---two,"+b+"---"+c);
}

}

主题对象的实现,
package com.csshu;

import java.util.ArrayList;
import java.util.List;

public class Subject implements mysubject{
private List<myobserver> array = new ArrayList<>();
@Override
public void registerObserver(myobserver o) {
array.add(o);
}

@Override
public void removeObserver(myobserver o) {
int index = array.indexOf(o);
if (index > -1){
array.remove(index);
}
}

public void notifyDatasetchange(int a ,int b,int c){
for (int i=0;i<array.size();i++){
array.get(i).update(a, b, c);
}
}

}
可以看到,我们实现了两个方法,主要是通过List来实现的,通过notifyDatasetchange方法
来给每个注册的观察者更新在主题中可以传递的数值,这里我们传递a,b,c

最后是main方法,
package com.csshu;

public class mains {
public static void main(String[] args) {
Subject sub = new Subject();
Observer o1 = new Observer();
Observer2 o2 = new Observer2();
sub.registerObserver(o1);
sub.registerObserver(o2);
sub.notifyDatasetchange(1, 2, 3);
}
}
我们new了一个主题,两个观察者,这里是通过调用主题对象里面的方法注册观察者,当然
可以更含蓄的通过观察者的构造方法传递主题对象的引用,然后再调用其注册方法。
主题用notify来把需要传递的数据传递给观察者。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: