前言
对观察者比较有兴趣,感觉工作中的用的很多,最典型的就要算dubbo了,zk将提供者或者服务者的信息推送给对方,当然,提供者和消费者都要在zk进行注册,这里以班长通知学生上课下课为原型,简单说一下观察者模式的用法,这是自己的总结,难免有错误和不足,欢迎指正
角色
1.有一个subject,monitor实现subject,班长(monitor)的各项功能,如登记学生,通知上下课
2.有具体的角色,primarystudent实现student,负责对班长通知的上下课事件进行响应
实现
负责定义班长的各项职责
public interface Subject {
public void addStudent(Student s);
public void reduceStudent(Student s);
public void informClassStart();
public void informClassEnd();
}
负责定义学生收到班长通知后所做动作
public interface Student {
public void classStart();
public void classEnd();
}
班长类的具体实现
public class Monitor implements Subject {
private ArrayList<Student> student ;
public Monitor() {
student = new ArrayList<Student>();
}
添加学生
public void addStudent(Student s) {
// TODO Auto-generated method stub
student.add(s);
}
移除学生
public void reduceStudent(Student s) {
// TODO Auto-generated method stub
student.remove(s);
}
循环通知所有学生上课
public void informClassStart() {
// TODO Auto-generated method stub
for (Student s : student) {
s.classStart();
}
}
循环通知所有学生下课
public void informClassEnd() {
// TODO Auto-generated method stub
for (Student s : student) {
s.classEnd();
}
}
}
学生收到班长通知后所触发的动作
public class PrimaryStudent implements Student {
private String name;
public PrimaryStudent(String name) {
this.name = name;
}
public void classStart() {
System.out.println(this.name + "上课了,好好学习!");
}
public void classEnd() {
System.out.println(this.name + "下课了,好爽!");
}
}
测试
public class ObserverTest {
public static void main(String[] args) {
Monitor m=new Monitor();
PrimaryStudent koeb=new PrimaryStudent("koeb");
m.addStudent(koeb);
m.addStudent(new PrimaryStudent("bryant"));
m.addStudent(new PrimaryStudent("wede"));
m.informClassStart();
System.out.println("---------");
m.reduceStudent(koeb);
m.informClassEnd();
}
}
执行结果
koeb上课了,好好学习!
bryant上课了,好好学习!
wede上课了,好好学习!
---------
bryant下课了,好爽!
wede下课了,好爽
总结
1.看了好多的设计模式,感觉其实总的一点,就是抽象编程,面向接口编程,同时要考虑接口的通用性和可扩展性
2.这个例子中,student在monitor那里注册(add),然后monitor负责在事件发生时向所有注册的student进行通知
3.student收到通知后,执行既有逻辑(如下课事件和上课事件)
最后,都是自己的一点点学习感悟,不喜勿喷,希望大家指正