今天学习了设计模式中的观察者设计模式,接下来我就用两种思路给大家讲解一下观察者设计模式。
传统模式对观察者的理解:
观察者模式定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象。这个主题对象状态发生改变的时候,会通知所有的观察者对象,使他们能够自动更新。
追MM模式对观察者的理解:
想知道公司mm最新的动态资讯吗?那么就加入公司mm情报资讯邮件组吧。Peter是mm情报资讯负责人,只要有mm的最新动态,就可以统一邮件发送给我们,就不需要一个一个的去通知了,我们作为订阅者就可以及时的收到mm最新的情报了,提高了我们泡妹子的成功率哟,哈哈哈哈哈
简单解释一下(解释的不好希望能给我留个言,让我好好的修改一下):
Peter的mm资讯:被观察者监听的主题对象。
订阅了mm资讯的人:观察者。
同一条mm的资讯 可以被 多个人订阅:一对多的关系。
--------------------------------------------------------------------------------
废话不多说,个大家来个简单的案例:
该案例是用Java的utils包中的Observable来实现的
下面的4个class放在同一个包下可以直接使用。
class 1:Peter(mm情资提供者)
import java.util.Observable;
public class Peter extends Observable {
/*
常用的方法
addObserver(Observer) 添加观察者
deleteObserver(Observer) 移除观察者
notifyObservers() 通知所有的观察者(发布)
setChanged() 设置消息已经改变的标记
*/
public String message;
/* 发布消息 */
public void publishMessage(String message) {
this.message = message;
System.out.println("Peter发布mm的消息:" + message);
setChanged();// 发布消息时需要设置消息改变标记
notifyObservers();//通知所有的观察者(发布)
}
}
class 2:SingleDog1(订阅了Peter情资的单身狗1号)
import java.util.Observable;
import java.util.Observer;
public class SingleDog1 implements Observer {
@Override
public void update(Observable o, Object arg) {
Peter peter = (Peter) o;
String message = peter.message;
System.out.println(this.getClass().getSimpleName()+"收到:"+message);
}
}
class3:SIngleDog2(订阅了Peter情资的单身狗2号)
import java.util.Observable;
import java.util.Observer;
public class SingleDog2 implements Observer{
@Override
public void update(Observable o, Object arg) {
Peter peter = (Peter) o;
String message = <span style="font-family: Arial, Helvetica, sans-serif;">peter.</span><span style="font-family: Arial, Helvetica, sans-serif;">message;</span>
System.out.println(this.getClass().getSimpleName()+"收到:"+message);
}
}
class4:MainTest(测试类)
public class MainTest {
public static void main(String[] args) {
Peter peter = new Peter();
SingleDog1 sd1 = new SingleDog1();
SingleDog2 sd2 = new SingleDog2();
//单身狗 订阅消息
peter.addObserver(sd1);
peter.addObserver(sd2);
//peter 发布消息
peter.publishMessage("公司来新前台了,身高170,绝对的ol范儿!");
}
}
java原生utils包中实现的观察者设计模式有一种致命的缺点,就是Peter必须继承Observable类,这样在某些类本身就继承了一个父类的情况下就不能使用这种方式了,例如:安卓中的一个类继承了Activity,那么就不能再继承Observable类了。
为了解决这种致命的问题,接下来我会在 《java设计模式_观察者Observer(二)》 中会给大家讲解一下使用接口回调的方式去实现观察者的设计模式。