JDK自带的观察者模式

Jdk提供了一个类Observable(用于支持被观察者),一个接口(用于支持观察者)。观察者类实现Observer接口,被观察者继承Observable类就可以很方便地实现观察者模式了。代码如下。

1:新建一个观察者类:student 其要实现Observer接口

/**
 * <h3>观察者类</h3>
 * 创建日期: 2018年1月25日
 * @author zhaosq
 */
public class Student implements Observer{

	private String name;

	public Student(){}
	public Student(String name){
		this.name = name;
	}

	/**
	 * 球队信息发生变化时发出此通知
	 */
	@Override
	public void update(Observable o, Object arg) {
		if(o instanceof Team){
			System.out.println(((Team) o).getName()+"获得了"+((Team) o).getScore());
		}else{
			System.out.println("观察了一个非 team 对象");
		}
	}
}

2:新建一个被观察者类:Team 其要继承类Observable

/**
 * <h3>被观察者类</h3>
 * 创建日期: 2018年1月25日
 * @author zhaosq
 */
public class Team extends Observable{
	/**
	 * 球队名称
	 */
	private String name;
	/**
	 * 球队得分
	 */
	private int score;

	public Team(){}
	public Team(String name){
		this.name = name;
	}
	public Team(String name,int score){
		this.name = name;
		this.score = score;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
		setChanged(); //这两段代码很重要是实现观察这模式的核心
		notifyObservers(LocalDate.now());
	}
}
3:新建一个测试类

public class Test{
	public static void main(String[] arg){
		Team team = new Team("骑士队");
		Student student = new Student("zsq");
		team.addObserver(student);
		team.setScore(98);
	}
}

当被观察者发生改变时 调用

setChanged();

notifyObservers(Object arg);

这两句代码就可以实现通知其观察者了。






要实现订阅和发布机制,可以使用观察者模式来实现。具体步骤如下: 1. 定义观察者接口Observer,包含一个更新方法update()。 2. 定义主题接口Subject,包含三个方法:注册观察者registerObserver()、移除观察者removeObserver()和通知观察者notifyObservers()。 3. 实现Subject接口,定义具体主题类ConcreteSubject,包含一个观察者列表List<Observer>,实现注册、移除和通知观察者的方法。 4. 实现Observer接口,定义具体观察者类ConcreteObserver,实现更新方法update()。 5. 在客户端中创建ConcreteSubject和ConcreteObserver对象,通过registerObserver()方法将观察者注册到主题对象中,然后调用ConcreteSubject对象的某个方法,触发notifyObservers()方法通知观察者,观察者接收到通知后,会调用具体的更新方法update()。 下面是Java代码实现: ``` // 观察者接口 public interface Observer { void update(); } // 主题接口 public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); } // 具体主题类 public class ConcreteSubject implements Subject { private List<Observer> observers = new ArrayList<>(); public void registerObserver(Observer observer) { observers.add(observer); } public void removeObserver(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } // 主题对象某个方法,触发通知观察者 public void doSomething() { // ... notifyObservers(); } } // 具体观察者类 public class ConcreteObserver implements Observer { public void update() { // 处理更新逻辑 } } // 客户端 public class Client { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); ConcreteObserver observer = new ConcreteObserver(); subject.registerObserver(observer); subject.doSomething(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值