java观察者模式小demo

观察者模式其实就是一句话——一旦发现xxx,就xxx。
比如一旦发现老师来,就假装好好学习。
比如一旦发现老板来,就停止闲聊。
比如一旦发现某服务启动,就执行某段代码。
再比如各种框架中的监听器,都是观察者模式。

首先,定义观察者和通知者的接口约束:

package interfaze;

/**
 * 观察者接口定义
 * @author lxp
 *
 */
public interface IObserver {
	
	/**
	 * 观察者做出反应
	 * @param status 突发事件通知
	 */
	void react(String status);
}

package interfaze;

import java.util.ArrayList;
import java.util.List;

/**
 * 通知者接口定义
 * @author lxp
 *
 */
public interface ISubject {
	
	/**
	 * 通知诸位观察者
	 */
	void notifyObs();
	
	/**
	 * 注册观察者
	 * @param observer 观察者
	 */
	void addObserver(IObserver observer);
}

然后,定义观察者和通知者都会有的一些信息(该步骤可省略):

package superclazz;

/**
 * 观察者父类,主要是所有观察者的共同属性。
 * @author lxp
 *
 */
public class ObserverSuper {

	// 观察者姓名等信息
	protected String name = "";

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}


package superclazz;

import java.util.ArrayList;
import java.util.List;

import interfaze.IObserver;

/**
 * 通知者父类,主要是所有通知者的共同属性。
 * @author lxp
 *
 */
public class SubjectSuper {

	/**
	 * 突发情况
	 */
	protected String status = "";
	
	/**
	 * 通知者姓名
	 */
	protected String name = "";

	/**
	 * 存储一系列的观察者
	 */
	List observerList = new ArrayList<IObserver>();
	
	/**
	 * 添加观察者
	 * @param employee 观察者
	 */
	public void addObserver(IObserver employee) {
		this.getObserverList().add(employee);
		
	}
	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public List getObserverList() {
		return observerList;
	}

	public void setObserverList(List observerList) {
		this.observerList = observerList;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}


接下来,写观察者(员工和学生)和通知者(老板和老师)的实现类:

package implement;

import interfaze.IObserver;
import superclazz.ObserverSuper;

/**
 * 雇员类
 * 
 * @author lxp
 *
 */
public class Employee extends ObserverSuper implements IObserver {

	public Employee(String empName) {
		this.setName(empName);
	}

	/**
	 * 观察者做出反应
	 * 
	 * @param status
	 *            突发事件通知
	 */
	@Override
	public void react(String status) {
		System.out.println(status + "我" + this.getName() + "得赶紧工作");

	}

}

package implement;

import interfaze.IObserver;
import superclazz.ObserverSuper;

/**
 * 学生类
 * 
 * @author lxp
 *
 */
public class Student extends ObserverSuper implements IObserver {

	public Student(String studentName) {
		this.setName(studentName);
	}

	/**
	 * 观察者做出反应
	 * 
	 * @param status
	 *            突发事件通知
	 */
	@Override
	public void react(String status) {
		System.out.println(status + "我" + this.getName() + "得赶紧学习");

	}

}

package implement;

import interfaze.IObserver;
import interfaze.ISubject;
import superclazz.SubjectSuper;

/**
 * 老板类
 * @author lxp
 *
 */
public class Boss extends SubjectSuper implements ISubject {

	public Boss(String bossName) {
		this.setName(bossName);
	}

	/**
	 * 通知诸位观察者
	 */
	@Override
	public void notifyObs() {
		for ( int i =0 ;i<this.getObserverList().size();i++){
			((IObserver)this.getObserverList().get(i)).react(this.getStatus());
		}
	}

	/**
	 * 覆盖父类方法,一旦状态发生改变,立即通知观察者们。
	 */
	public void setStatus(String status) {
		this.status = status;
		this.notifyObs();
	}
}

package implement;

import interfaze.IObserver;
import interfaze.ISubject;
import superclazz.SubjectSuper;

/**
 * 老师类
 * @author lxp
 *
 */
public class Teacher extends SubjectSuper implements ISubject {

	public Teacher(String teacherName) {
		this.setName(teacherName);
	}

	/**
	 * 通知诸位观察者
	 */
	@Override
	public void notifyObs() {
		for ( int i =0 ;i<this.getObserverList().size();i++){
			((IObserver)this.getObserverList().get(i)).react(this.getStatus());
		}
	}

	/**
	 * 覆盖父类方法,一旦状态发生改变,立即通知观察者们。
	 */
	public void setStatus(String status) {
		this.status = status;
		this.notifyObs();
	}
	
}

最后,上测试程序:

package test;

import implement.Boss;
import implement.Employee;
import implement.Student;
import implement.Teacher;
import interfaze.IObserver;
import interfaze.ISubject;
import superclazz.SubjectSuper;

public class Test {

	public static void main(String[] args) {
		// 这些是赵老的老板的员工们
		IObserver employee1 = new Employee("张老三");
		IObserver employee2 = new Employee("李老四");
		IObserver employee3 = new Employee("王老五");
		IObserver employee4 = new Employee("赵老六");
		// 注册赵老大为通知者
		SubjectSuper boss = new Boss("赵老大");
		boss.addObserver(employee1);
		boss.addObserver(employee2);
		boss.addObserver(employee3);
		boss.addObserver(employee4);
		// 一旦赵老大回来了,员工们就赶紧停止偷懒好好干活儿。
		boss.setStatus("赵老大来了");
		
		
		// 这是刘老师的学生们
		IObserver student1 = new Student("张三");
		IObserver student2 = new Student("李四");
		IObserver student3 = new Student("王五");
		IObserver student4 = new Student("赵六");
		// 注册刘老师为通知者
		SubjectSuper teacher = new Teacher("刘老师");
		teacher.addObserver(student1);
		teacher.addObserver(student2);
		teacher.addObserver(student3);
		teacher.addObserver(student4);
		// 一旦刘老师回来了,同学恩就赶紧停止交头接耳好好学习。
		teacher.setStatus("刘老师来了");
	}

}




===========本人用java写的观察者模式的小demo,源码里有详细的注释,保证一看就懂。欢迎大牛指点。======================

=========================================转载请注明出处,谢谢啦^_^=========================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值