大家好,现在我们开始讲解8个必问模式中的第八种:观察者模式
观察者模式
举几个简单的生活例子:
- 1.比如你特别关注了某个的空间动态或者微信,当他们的信息更新的时候,你就会看到提醒信息,好比1千万个微博粉丝,当他们的偶像更新了一条说说,那么他们就会收到提醒.
- 2.又如订阅:你订阅了某篇文章,如果后续有改动,就会通知你
- 3.通俗说法:当一个对象放生变化,那么依赖这个对象的其他对象会收到通知,并且随之改变,是一种”一对多关系”
代码:
1.一个观察者接口-(粉丝接口)
有更新的方法-(每个粉丝收到信息的举动)
2.多个”具体的观察者类”实现接口(一个个具体的粉丝)
更新的方法-(每个粉丝收到信息的不同反应)
2.管理类的接口-(即空间系统接口)
增删(观察者),通知,自身操作方法-(检测你们谁关注了,后面通知你们)
3.新建一个管理的”抽象类”实现管理类接口
1.不写但相当于"也有了"实现所有的方法.
2.那么如果想改具的方法,那么只需要重写想改的.
(1.新建一个集合,存各个观察者的方法)
(2.删各个观察者的方法)
(3.通知方法里,遍历,调用更新的方法)
4.写一个真正的具体类,继承抽象类.-为了简洁,就分开了
自身操作的方法,调用通知的方法
代码
//观察者接口,有更新的方法
interface Observer {
void update();
}
//具体的实现对象
class Oberver1 implements Observer {
@Override
public void update() {
System.out.println("person 1 had received...");
}
}
class Oberver2 implements Observer {
@Override
public void update() {
System.out.println("person 2 hand received...");
}
}
class Oberver3 implements Observer {
@Override
public void update() {
System.out.println("person 3 hand received...");
}
}
//操作接口
interface Subject {
void add(Observer obs);
void del(Observer obs);
void notification();
void operation();
}
//抽象类,实现接口,相当于有了那么多的方法了
abstract class AbstractSubjet implements Subject {
Vector<Observer> mVector = new Vector();
//三个方法改动,我就重写3个方法
@Override
public void add(Observer observer) {
mVector.add(observer);
}
@Override
public void del(Observer observer) {
mVector.remove(observer);
}
@Override
public void notification() {
//遍历集合通知
Enumeration elements = mVector.elements();
while (elements.hasMoreElements()) {
Observer o = (Observer) elements.nextElement();
//调用通知
o.update();
}
}
}
//具体类,继承了抽象类,只重写操作类即可
class MySubjet extends AbstractSubjet {
@Override
public void operation() {
notification();//调用自己继承的
}
}
//测试类
public class ObserverTest {
public static void main(String[] args) {
Subject subject = new MySubjet();//指向子类对象,跨子类对象
Oberver3 oberver3 = new Oberver3();
subject.add(new Oberver1());
subject.add(new Oberver2());
subject.add(oberver3);
subject.operation();
System.out.println("--------------------remove----------------------");
subject.del(oberver3);
subject.operation();
}
}
打印结果:
person 1 had received...
person 2 hand received...
person 3 hand received...
--------------------remove----------------------
person 1 had received...
person 2 hand received...
总结:
1.实现了通观察者接口的多个观察者
2.管理接口,定义操作方法
3.管理"抽象类"-实现-"管理接口",但只重写详细的操作方法:增加,删除,通知
4.管理的"具体类"-**继承**抽象类,重写一条方法-比如这里的"操作方法",就能完成方案