自定义观察者设计模式

本文介绍了如何在Java中自定义观察者设计模式,避免由于系统自带的Observable类限制继承而带来的问题。通过创建自己的被观察者和观察者类,实现了消息传递的功能,并给出了具体的代码示例。
摘要由CSDN通过智能技术生成

一。先看系统自带的观察者设计模式
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值