Java设计模式之观察者模式

本文介绍了观察者模式的基本概念,通过报社与订阅者的例子说明其工作原理,并提供了Java代码实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

观察者模式(Observer):观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主体对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己.

举个生活中的例子:报社和订阅者,这里的报社相当于主题,订阅者就是观察者,一旦报社发布了新报刊,那么订阅者就可以收到由报社发出的报刊

举个Java中的例子,Swing事件监听

下面举出Java代码:

package One;

import Many.Subscriber;

//报社
public interface office {
	void add(Subscriber subscribers);
	void remove(Subscriber subscribers);
}

package One;

import java.util.ArrayList;

import Many.Subscriber;

public class officeImp implements office{

	private ArrayList list = null;
	
	private String message;
	
    public officeImp() {
    	list = new ArrayList<>();
    }
	
	@Override
	public void add(Subscriber subscribers) {
		// TODO Auto-generated method stub
		list.add(subscribers);
	}

	@Override
	public void remove(Subscriber subscribers) {
		// TODO Auto-generated method stub
		if(list.contains(subscribers))
			list.remove(subscribers);
		else
			return;
	}
	//状态改变
	public void changeMessage(String message){
		this.message = message;
		this.update();
	}
	//通知
	public void update(){
		for(Subscriber s:list){
			s.update(message);
		}
	}
}

package Many;
//订阅者
//统一接口,订阅者接口
public interface Subscriber {
	void update(String message);
}


package Many;
//感谢
public interface Thinking {
	void think();
}

package Many;

public class Mike implements Subscriber,Thinking{

	private String message;
	
	@Override
	public void think() {
		// TODO Auto-generated method stub
		System.out.println("Mike收到了消息:"+message);
	}

	@Override
	public void update(String message) {
		// TODO Auto-generated method stub
		this.message = message;
		think();
	}
	
}

package Many;

public class Sam implements Subscriber,Thinking{

	private String message;
	
	@Override
	public void think() {
		// TODO Auto-generated method stub
		System.out.println("Sam收到了消息:"+message);
	}

	@Override
	public void update(String message) {
		// TODO Auto-generated method stub
		this.message = message;
		think();
	}
	
}


package test;

import org.junit.Test;

import Many.Mike;
import Many.Sam;
import One.officeImp;

public class testUnit {
	@Test
	public void test1(){
		officeImp imp =  new officeImp();
		Mike mike = new Mike();
		Sam sam = new Sam();
		imp.add(sam);//Sam订阅了报刊
		imp.add(mike);//Mike订阅了报刊
		imp.changeMessage("发布了新书了");
		System.out.println("-----------------------");
		imp.changeMessage("又有新优惠了");
	}
}

----------
Sam收到了消息:发布了新书了
Mike收到了消息:发布了新书了
-----------------------
Sam收到了消息:又有新优惠了
Mike收到了消息:又有新优惠了
值得注意的是,jdk内置了观察者模式的实现,与以上代码大同小异

类:Observable

接口:Observer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值