近来,Android的学习中,常常提及观察者模式这个东东。这个到底是哪个洞天呢?下面是我的一个认识。
1.一些存在;
在我的Java和Android中是不是常常有如下代码:
Java==》JFrme
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("你点击了我");
}
});
在JFrame中的button的点击事件。点击就触发事件,实现:System.out.println("你点击了我");
Java==》Android
myButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
System.out.println("你点击了我");
}
});
在Android中的button的实现点击了事件。点击触发,同上的结果;
2.一些事件的业务 ;
一个事件A因为事件B的变化而变化。就是A因为B而变化(敌动我动,敌不动我不动),其实,在我的所有的事件中都是这样的:因——果。
3.初步总结:
3.1 有一个数据源:Source
3.2.有因数据源变化的观察者(一个多个):Observer
问题:因——果就是数据源和观察者,那么他们之间的链接是什么呢?
答:这个我们一时间不知道,但是你看看我们以前的列子吧
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("你点击了我");
}
});
他们是通过。addActionListener();的函数链接的,链接中的函数式一个接口函数。
4.观察者模式:
如图:两种形式,虽然不是官方(标准),只能像个样了。详细代码:
package com.owant.observer;
public class Client {
/**
* 观察者模式: 1.特点:当某个对象变化时,别的对象跟着变化 2.可以有多个观察者 3.实现数据的共享和有业务和对象的分离
*
* 实现方法: 1.创建一个被观察的主题Subject。他的父类为一个抽象的观察主题 他至少提供三个接口: addObserver 添加观察者
* removeObserver 移除观察者 notifyAllObserver 提醒观察者
*
* 2.创建一个观察者。他的父类一般提供一个接口: upDate 更新数据
*
* 3.主题添加观察者
*
* 4.主题提醒观察者
*
*/
public static void main(String[] args) {
// 创建一个被观察的主题
MyThemEvent event = new MyThemEvent();
// 创建一个观察者
MyObserver observer = new MyObserver("1");
MyObserver observer2=new MyObserver("2");
// 提醒观众者
event.notifyAllObserver();
// 添加观察者
event.addObserver(observer);
event.addObserver(observer2);
event.notifyAllObserver();
}
}
package com.owant.observer;
import java.util.ArrayList;
import java.util.List;
public class MyThemEvent implements ThemeEvent {
// 一个数据
private String str = "I am source";
// 记录观察者
private List<ObserverFather> list = new ArrayList();
public void addObserver(ObserverFather observer) {
if (observer != null) {
list.add(observer);
}
}
public void removeObserver(ObserverFather observer) {
if (list.size() != 0) {
list.remove(observer);
}
}
public void notifyAllObserver() {
for (ObserverFather of : list) {
of.upDate(str);
}
}
}
package com.owant.observer;
public class MyObserver implements ObserverFather {
private String Id;
public MyObserver(String str){
this.Id=str;
}
public void upDate(String str) {
System.out.println("我是观察者"+Id+" 被观察的事件源发来数据为:" + str);
}
}
package com.owant.observer;
public interface ThemeEvent {
// 添加观察者
public void addObserver(ObserverFather observer);
// 移除观察者
public void removeObserver(ObserverFather observer);
// 提醒观察者
public void notifyAllObserver();
}
package com.owant.observer;
public interface ObserverFather {
// 跟新数据
public void upDate(String str);
}
结果:
我是观察者1 被观察的事件源发来数据为:I am source
我是观察者2 被观察的事件源发来数据为:I am source
另一种:
package com.owant.observer.simplemodel;
public class LikeButton {
private String str;
private Listener listener;
// 提供一个数据接口
public interface Listener {
public void upDate(String str);
}
// 数据变化
public void ButtonEvent(String str) {
this.str = str;
if (listener != null) {
listener.upDate(str);
}
}
// 添加数据变化的监听
public void addListener(Listener listener) {
this.listener=listener;
}
}<strong>
</strong>
package com.owant.observer.simplemodel;
import com.owant.observer.simplemodel.LikeButton.Listener;
public class Client {
/**
* 这个观察者的模式是: 当数据改变时提供一个函数接口来获得 ,并且观察者在class内部
*/
public static void main(String[] args) {
LikeButton lButton = new LikeButton();
lButton.ButtonEvent("我点一次点击!");
// 添加监听
// lButton.addListener(new Listener() {
//
// public void upDate(String str) {
//
// System.out.println(str);
// }
// });
lButton.addListener(new MyListener());
lButton.ButtonEvent("我第二次被点击了");
}
static class MyListener implements Listener {
public void upDate(String str) {
System.out.println("我抓到的数据是:" + str);
}
}
}
这就是传说中的观察者模式。
推荐软件:思维导图