理解【观察者模式】的正确姿势

1、

观察者,观察者,顾名思义,就是由一拨人观察一些东西,所以两个东西就诞生了,那就是:人、东西

既然是一拨人,比如说这些人有,小王,小刘,等等

那么我们首先,第一件事情就是创建这些人

小王类 小王 = new 小王类();
小刘类 小刘 = new 小刘类();

我们还需要有观察的东西,比如说这些人会说话,就是听什么,说什么

class 小王类{
	void 说话(String 话) {
		System.out.println();
	}
}

class 小刘类{
	void 说话(String 话) {
		System.out.println();
	}
}

2、

那他们怎么去观察呢,反过来就是你要把一件事情告诉他们,怎么告诉?

举个例子

public class Main {
    public static void main(String[] args) throws IOException {
		小王类 小王 = new 小王类();
		小刘类 小刘 = new 小刘类();

		小王.说话("啦啦啦啦啦");
		小刘.说话("啦啦啦啦啦");
    }
}

这样就可以了

3、

但是,我们继续想,我们要保证每个人都会说话,如果小王不会说话,但是你调用小王的 “说话” 方法,一定会报错的,怎样来保证他们都具有说话的方法呢?

当然是让他们都继承一个东西,或者实现什么东西,这样就能强制让他们都有 “说话” 这个方法了

那好,我们就随便起个名字,比如说就是观察者,在里面定义一个方法,就可以保证所有的孩子都具有说话这个方法了

interface 观察者 {
	void 说话(String 话);
}

下面,我们必须让小王和小刘继承这个接口

class 小王类 implements 观察者{
	@Override
	void 说话(String 话) {
		System.out.println();
	}
}

class 小刘类 implements 观察者{
	@Override
	void 说话(String 话) {
		System.out.println();
	}
}

这样就保证了在main方法访问的时候不出现访问不到的情况了

4、

但是还有一个问题,就是如果用户太多了,怎么办了,比如说又来了小张、小李。。。。

public class Main {
    public static void main(String[] args) throws IOException {
		小王类 小王 = new 小王类();
		小刘类 小刘 = new 小刘类();
		小张类 小张 = new 小张类();
		小李类 小李 = new 小李类();

		小王.说话("啦啦啦啦啦");
		小刘.说话("啦啦啦啦啦");
		小张.说话("啦啦啦啦啦");
		小李.说话("啦啦啦啦啦");
    }
}

这就太乱了,太多了,如果有100个,那还要写到什么时候了

好吧,我们一怒之下,写一个管理他们的类,然后把他们都放到一起,然后一起通知

知道了需求之后,我们来想一下,既然要把他们都放到一块,那么我们必须要有一个放他们的容器,就是那什么放

ArraList<>

写不下去了,我们要把他们都放到容器里面,但是我们不知道他们是什么类型,我们没办法放,但是转念一想,刚才我们定义了一个 “观察者” 类,来把他们都统筹放到一块,所以不管是小张、小王、小刘。。。他们一定都是“观察者”类型

ArraList<观察者> 名单 = new ArrayList<观察者>();

这样,我们就建立了一个容器,来放置小张、小王、小刘。。。

5、

那要通知他们怎么办了?

直接利用容器的循环遍历就可以了

for (观察者 每个人 : 名单) {	#在名单中来遍历每个人,然后通知他们
    每个人.说话("啦啦啦啦啦啦");	#调用每个人的说话方法
}

好了,现在我们就实现的完全自动化了

除此之外,我们添加一些加入啦,删除啦,等等这些方法

class 管理类{
	ArraList<观察者> 名单 = new ArrayList<观察者>();

	void 刷新(String 话){
		for (观察者 每个人 : 名单) {	#在名单中来遍历每个人,然后通知他们
		    每个人.说话("啦啦啦啦啦啦");	#调用每个人的说话方法
		}
	}
}

现在,我们在main方法中

public class Main {
    public static void main(String[] args) throws IOException {
		小王类 小王 = new 小王类();
		小刘类 小刘 = new 小刘类();
		小张类 小张 = new 小张类();
		小李类 小李 = new 小李类();
		
		管理类 管理对象 = new 管理类();

		管理对象.添加(小王);	# 由于不是主要部分,就不实现了
		管理对象.添加(小刘);
		管理对象.添加(小张);
		管理对象.添加(小李);
		
		管理对象.刷新("啦啦啦啦啦");
    }
}

好的,现在我们就实现了统一的管理,只要添加进去,我们就可以随意喊话了

管理对象.刷新("啦啦啦啦啦");
管理对象.刷新("啦啦啦啦啦啦啦啦啦");
管理对象.刷新("啦啦啦啦啦啊啊啊啊啊啊啊啊啊");
管理对象.刷新("啦啦啦啦啦咔咔咔咔咔咔咔咔咔咔咔咔咔咔咔咔咔");

只要我们写这样的几句话,所有的成员都会叫

6、

那么如果有多个管理,怎么办呢?和前面一样的思路,把必须要的功能写成接口,这样就可以保证规范了

interface 管理类接口{
	void 添加观察者(观察者 成员); //这里虽然写的是观察者,但是我们添加的时候是添加的具体的小王、小刘、等等,只不过他们都是观察者类型,所以就简写为这样了
	void 删除观察者(观察者 成员);//这里虽然写的是观察者,但是我们添加的时候是添加的具体的小王、小刘、等等,只不过他们都是观察者类型,所以就简写为这样了
	void 刷新();
}

这样,我们就实现了完整的观察者模式,
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值