自定义观察者设计模式
Posted Lqc_javaEngineer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义观察者设计模式相关的知识,希望对你有一定的参考价值。
一。先看系统自带的观察者设计模式
package com.itheima.jiuye;
import java.util.Observable;
/**
* (1) Observable 类代表 被观察者 (java.util.Observable)
主要方法有:
void setChanged(): 设置被观察者的状态已经被改变
void addObserver(Observer observer): 添加观察者
int countObservers() : 返回所有观察者的数目
void deleteObserver(Observer observer):删除指定观察者
void deleteObservers(): 删除所有观察者
boolean hasChanged() : 被观察者的状态是否被改变,如果是则返回true,否则返回false
void notifyObservers() : 通知所有观察者(没有参数)
void notifyObservers(Object arg) : 通知所有观察者(带参数,参数一般设定为被改变的属性)
void clearChanged() :清除被观察者状态的改变(即调用 hasChanged() 时会返回 false)
*/
public class Teacher extends Observable
public String message;
public void doPublishMessage(String message)
System.out.println("老师说: " + message);
this.message = message;
setChanged();
notifyObservers();
package com.itheima.jiuye;
import java.util.Observable;
import java.util.Observer;
public class Student1 implements Observer
@Override
public void update(Observable o, Object arg)
Teacher teacher = (Teacher) o;
String message = teacher.message;
System.out.println(getClass().getSimpleName() + " 听到老师的 " + message);
package com.itheima.jiuye;
import java.util.Observable;
import java.util.Observer;
public class Student2 implements Observer
@Override
public void update(Observable o, Object arg)
Teacher teacher = (Teacher) o;
String message = teacher.message;
System.out.println(getClass().getSimpleName() + " 听到老师的 " + message);
package com.itheima.jiuye;
public class Test
public static void main(String[] args)
Teacher teacher = new Teacher();//一处数据改变.多处得到通知
// 告诉学生关注自己说的事情
teacher.addObserver(new Student1());
teacher.addObserver(new Student2());
teacher.addObserver(new Student3());
teacher.addObserver(new Student4());
teacher.addObserver(new Student5());
// 老师说一段话
teacher.doPublishMessage("班上xx同学,拿到了一个12k的offer");
打印出来的结果:
老师说: 班上xx同学,拿到了一个12k的offer
Student5 听到老师的 班上xx同学,拿到了一个12k的offer
Student4 听到老师的 班上xx同学,拿到了一个12k的offer
Student3 听到老师的 班上xx同学,拿到了一个12k的offer
Student2 听到老师的 班上xx同学,拿到了一个12k的offer
Student1 听到老师的 班上xx同学,拿到了一个12k的offer
二、在实际的项目开发中不使用系统自带的,原因是别观察者teacher必须继承Observable ,但是java为单继承,所以不能再继承其他类了,所以很少使用,一般使用的话必须自定义,根据系统的源代码:
package com.itheima.jiuye.demo62.copy;
被观察者:
import java.util.LinkedList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
* @author Administrator
* @time 2015-7-20 上午10:46:53
* @des TODO
*
* @version
Rev
* @updateAuthor
Author
* @updateDate
Date
* @updateDes TODO
*/
public class Teacher
/*
addObserver(Observer)//添加观察者
countObservers()//统计观察者数量
deleteObserver(Observer)//删除观察者
deleteObservers()//删除所有的观察者
hasChanged()
notifyObservers()//通知所有的观察者
notifyObservers(Object)//通知所有的观察者,带参数
*/
public String message;
public void pulishMessage(String messsage)
this.message = messsage;
notifyObservers(messsage);
public interface MyObserver
void update(String message);
List<MyObserver> observers = new LinkedList<Teacher.MyObserver>();
/**添加观察者*/
public void addObserver(MyObserver observer)
if (observer == null)
throw new NullPointerException("observer == null");
synchronized (this)
if (!observers.contains(observer))
observers.add(observer);
/**删除观察者*/
public synchronized void deleteObserver(Observer observer)
observers.remove(observer);
/**通知观察者数据改变*/
public void notifyObservers(String message)
for (MyObserver observer : observers)
observer.update(message);
观察者实现类:
package com.itheima.jiuye.demo62.copy;
import java.util.Observable;
import java.util.Observer;
import com.itheima.jiuye.demo62.copy.Teacher.MyObserver;
/**
* @author Administrator
* @time 2015-7-20 上午10:47:28
* @des TODO
*
* @version
Rev
* @updateAuthor
Author
* @updateDate
Date
* @updateDes TODO
*/
public class Student1 implements MyObserver
@Override
public void update(String message)
System.out.println(this.getClass().getSimpleName() + ” 收到 ” + message);
测试类:
package com.itheima.jiuye.demo62.copy;
/**
* @author Administrator
* @time 2015-7-20 上午10:49:27
* @des TODO
*
* @version
Rev
* @updateAuthor
Author
* @updateDate
Date
* @updateDes TODO
*/
public class Test
public static void main(String[] args)
Teacher teacher = new Teacher();
Student1 student1 = new Student1();
Student2 student2 = new Student2();
Student3 student3 = new Student3();
Student4 student4 = new Student4();
Student5 student5 = new Student5();
Student6 student6 = new Student6();
teacher.addObserver(student1);
teacher.addObserver(student2);
teacher.addObserver(student3);
teacher.addObserver(student4);
teacher.addObserver(student5);
teacher.addObserver(student6);
teacher.pulishMessage("2015年7月20日10:50:34 xx同学,拿到了一个12k的offer");
打印结果:
Student1 收到 2015年7月20日10:50:34 xx同学,拿到了一个12k的offer
Student2 收到 2015年7月20日10:50:34 xx同学,拿到了一个12k的offer
Student3 收到 2015年7月20日10:50:34 xx同学,拿到了一个12k的offer
Student4 收到 2015年7月20日10:50:34 xx同学,拿到了一个12k的offer
Student5 收到 2015年7月20日10:50:34 xx同学,拿到了一个12k的offer
Student6 收到 2015年7月20日10:50:34 xx同学,拿到了一个12k的offer
以上是关于自定义观察者设计模式的主要内容,如果未能解决你的问题,请参考以下文章