自定义观察者设计模式

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

以上是关于自定义观察者设计模式的主要内容,如果未能解决你的问题,请参考以下文章

Spring标准事件和自定义事件-观察者模式

Spring标准事件和自定义事件-观察者模式

Spring标准事件和自定义事件-观察者模式

Spring标准事件和自定义事件-观察者模式

观察者模式

观察者模式--自定义事件