Java设计模式 观察者模式
在我们开发的时候有一种场景,需要对某个事物(类的对象等)的某种状态进行监测,当被观察者的状态改变的时候,需要进行某些相应的操作,实际上在Java中,就可以通过观察者模式这种设计模式来实现。
下面我们通过一个简单的例子来了解一下观察者模式:
Base接口
我们先抽象出来2个接口,首先是观察者接口。
package com.lhy.android.baseinterface;
public interface IObserver {
void update();
}
其次是被观察的对象接口,其中定义的2个方法,以便与观察者绑定与解绑。
package com.lhy.android.baseinterface;
public interface ISubject {
void attach(IObserver ob);
void detach(IObserver ob);
}
观察者对象
下面我们模拟一个场景,在学校中,老师和学生听到上课铃声之后开始上课,那么不难发现,学生和老师应该就是观察者,铃声就是被观察的主题,当铃声响的时候,学生和老师有所动作。
具体的观察者1,学生:
package com.lhy.android.observer;
import com.lhy.android.baseinterface.IObserver;
public class Student implements IObserver{
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("上课铃声响了,学生们开始上课");
}
}
具体的观察者2,老师:
package com.lhy.android.observer;
import com.lhy.android.baseinterface.IObserver;
public class Teacher implements IObserver{
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("上课铃声响了,老师开始上课");
}
}
被观察者对象
具体的被观察者,铃声:
package com.lhy.android.subject;
import java.util.ArrayList;
import java.util.List;
import com.lhy.android.baseinterface.IObserver;
import com.lhy.android.baseinterface.ISubject;
public class RingBell implements ISubject{
protected List<IObserver> list = new ArrayList<>();
@Override
public void attach(IObserver ob) {
// TODO Auto-generated method stub
list.add(ob);
}
@Override
public void detach(IObserver ob) {
// TODO Auto-generated method stub
list.remove(ob);
}
public void ring(){
for (IObserver ob : list) {
ob.update();
}
}
}
测试类
下面是测试类:
package com.lhy.android.test;
import com.lhy.android.observer.Student;
import com.lhy.android.observer.Teacher;
import com.lhy.android.subject.RingBell;
public class Test {
public static void main(String[] args) {
/**
* 创建观察者实例
*/
Teacher mathTeacher = new Teacher();
Student studentA = new Student();
Student studentB = new Student();
/**
* 被观察者
*/
RingBell rb = new RingBell();
rb.attach(mathTeacher);
rb.attach(studentA);
rb.attach(studentB);
rb.ring();
}
}
当调用ringbell实例的时候,结果如下,我们可以发现学生和老师开始接收到了铃声的变化开始执行自己的工作了,相信通过这个简单的例子应该可以理解观察者模式了。
上课铃声响了,老师开始上课
上课铃声响了,学生们开始上课
上课铃声响了,学生们开始上课