设计模式大冒险第一关:观察者模式

观察者模式

最近把之前学习过的这些设计模式又再次温习了一下,觉得还是有很多收获的。确实有了温故知新的感觉,所以准备在每个设计模式复习完之后都能够写一篇关于这个设计模式的文章,这样会让自己能够加深对这个设计模式的理解;也能够跟大家一起来探讨一下。

今天我们来一起学习一下观察者模式,刚开始我们不需要知道观察者模式的定义是什么,这些我们到后面再去了解。我想先带着大家从生活中的一个小事例开始。从生活中熟悉的事情入手,会让我们更快速的理解这个模式的用途

生活中的小例子

相信大家都关注过一些公众号,那么对于一个公众号来说,如果有新的文章发布的话;那么所有关注这个公众号的用户都会收到更新的通知,如果一个用户没有关注或者关注后又取消了关注,那么这个用户就不会收到该公众号更新的通知。相信这个场景大家都很熟悉吧。那么如果我们把这个过程抽象出来,用代码来实现的话,你会怎么处理呢?不妨现在停下来思考一下。

通过上面的描述,我们知道这是一个一对多的关系。也就是一个公众号对应着许多关注这个公众号的用户。

关注公众号

那么对于这个公众号来说,它的内部需要有一个列表记录着关注这个公众号的用户,一旦公众号有了新的内容。那么对于公众号来说,它会遍历这个列表。然后给列表中的每一个用户发送一个内容跟新的通知。我们可以通过代码来表示这个过程:

// 用户
const user = {
   
	update() {
   
		console.log('公众号更新了新的内容');
	},
};

// 公众号
const officialAccount = {
   
    // 关注当前公众号的用户列表
	followList: [user],
    // 公众号更新时候调用的通知函数
	notify() {
   
		const len = this.followList.length;
		if (len > 0) {
   
		    // 通知已关注该公众号的每个用户,有内容更新
			for (let user of this.followList) {
   
				user.update();
			}
		}
	},
};

// 公众号有新内容更新
officialAccount.notify();

运行的结果如下:

公众号更新了新的内容

上面的代码能够简单的表示,当公众号的内容发生了更新的时候,去通知关注该公众号的用户的过程。但是这个实现是很简陋的,还缺少一些内容。我们接下来把这些缺少的过程补充完整。对于公众号来说,还需要可以添加新的关注的用户,移除不再关注的用户,获取关注公众号的用户总数等。我们来实现一下上面的过程:

// 公众号
const officialAccount = {
   
	// 关注当前公众号的用户列表
	followList: [],
	// 公众号更新时候调用的通知函数
	notify() {
   
		const len = this.followList.length;
		if (len > 0) {
   
			// 通知已关注该公众号的每个用户,有内容更新
			for (let user of this.followList) {
   
				user.update();
			}
		}
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以给你一个简单的Java观察者模式案例,请看下面的代码: public class Main { public static void main(String[] args) { // 创建被观察者 Observable observable = new Observable(); // 创建观察者 Observer observer = new Observer(); // 添加观察者 observable.addObserver(observer); // 改变被观察者的状态 observable.setChanged(); // 通知观察者 observable.notifyObservers("Hello Observer!"); } } ### 回答2: 观察者设计模式是一种行为型设计模式,它定义了一种对象之间的一对多依赖关系,使得当一个对象的状态发生变化时,所有依赖它的对象都会收到通知并自动更新。 以下是一个使用Java编写的观察者设计模式的简单案例: 1. 首先,我们创建一个被观察者类(Subject),它内部包含一个状态属性和一个观察者列表。该类提供注册观察者、删除观察者和通知观察者的方法。 ```java import java.util.ArrayList; import java.util.List; public class Subject { private int state; private List<Observer> observers = new ArrayList<>(); public int getState() { return state; } public void setState(int state) { this.state = state; notifyObservers(); } public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } } ``` 2. 接下来,我们创建一个观察者接口(Observer),它定义了一个update()方法,用于接收被观察者的通知并作出相应的动作。 ```java public interface Observer { void update(); } ``` 3. 然后,我们创建一个具体的观察者类(ConcreteObserver),实现Observer接口的update()方法,用于在接收到被观察者的通知时执行一些操作。 ```java public class ConcreteObserver implements Observer { @Override public void update() { System.out.println("Received notification from subject."); // 执行相应的操作 } } ``` 4. 最后,我们可以在主程序中进行测试。 ```java public class Main { public static void main(String[] args) { Subject subject = new Subject(); Observer observer1 = new ConcreteObserver(); Observer observer2 = new ConcreteObserver(); subject.attach(observer1); subject.attach(observer2); subject.setState(1); } } ``` 以上代码创建了一个Subject对象,并向其注册了两个ConcreteObserver观察者。当调用subject.setState(1)时,观察者们会接收到通知并执行相应的操作。 这个简单的案例展示了观察者设计模式的基本实现方式,实际应用中可以根据需求进行扩展和优化。 ### 回答3: 观察者设计模式是一种常见的软件设计模式,它用于对象之间的一对多依赖关系。在该模式中,一个对象(称为“主题”或“被观察者”)维护了一组观察者对象,并在其状态变化时自动通知观察者。当主题对象发生变化时,所有观察者对象都将得到相应的通知更新自己的状态。 下面以一个简单的案例来说明如何用Java编写一个观察者设计模式的例子: 假设我们有一个主题类Subject和两个观察者类ObserverA和ObserverB。Subject类中有一个状态count和一个观察者集合observers,提供了注册观察者、删除观察者和通知观察者的方法。ObserverA和ObserverB继承自观察者接口Observer,并实现了该接口的update方法,用于接收主题状态的更新。 代码示例如下: ```java import java.util.ArrayList; import java.util.List; interface Observer { void update(int count); } class Subject { private int count; 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(count); } } public void setCount(int count) { this.count = count; notifyObservers(); } } class ObserverA implements Observer { @Override public void update(int count) { System.out.println("ObserverA received update: " + count); } } class ObserverB implements Observer { @Override public void update(int count) { System.out.println("ObserverB received update: " + count); } } public class Main { public static void main(String[] args) { Subject subject = new Subject(); ObserverA observerA = new ObserverA(); ObserverB observerB = new ObserverB(); subject.registerObserver(observerA); subject.registerObserver(observerB); subject.setCount(10); // 输出: // ObserverA received update: 10 // ObserverB received update: 10 subject.removeObserver(observerA); subject.setCount(20); // 输出: // ObserverB received update: 20 } } ``` 在上述示例中,我们创建了一个主题Subject和两个观察者ObserverA和ObserverB。我们首先注册了两个观察者对象,然后通过调用setCount方法来设置Subject的状态并通知所有的观察者对象。在执行setCount方法后,观察者对象的update方法将被调用,更新它们的状态。 通过这个简单的例子,我们可以看到,观察者设计模式能够实现对象之间的松耦合,主题对象和观察者对象之间的关系不是硬编码在一起的,而是通过注册和通知的方式实现动态的绑定。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值