观察者模式—特殊版
有时候我们使用观察者模式会通知所有的观察者来一起操作这样子不是特别的好,所以我们通过在目标类那里加上条件判断该类事件需要通知哪一类的观察者首先我们定义一个观察者接口
package com.text;
/**
* @author:b.liang
* @date:2023/4/24/9:32
*/
//定义一个观察者接口
public interface Observer {
//点击的接口
void onclick(SupperObject object);
//设置名称
void setObserverName(String observerName);
String getObserverName();
}
然后实现它
package com.text;
/**
* @author:b.liang
* @date:2023/4/24/10:42
*/
public class ConcreteObserver implements Observer{
//定义观察者名称 ,事件情况,提醒内容
private String observerName;
private String supperContent; //目标处获取的状态
private String remindThing;
@Override
public void onclick(SupperObject object) {
//获取目标的状态
supperContent = object.getSupperContent();
System.out.println(observerName+"收到了"+supperContent+remindThing);
}
@Override
public void setObserverName(String observerName) {
this.observerName=observerName;
}
public String getSupperContent() {
return supperContent;
}
public void setSupperContent(String supperContent) {
this.supperContent = supperContent;
}
public String getRemindThing() {
return remindThing;
}
public void setRemindThing(String remindThing) {
this.remindThing = remindThing;
}
@Override
public String getObserverName() {
return this.observerName;
}
}
接着定义目标类
package com.text;
import java.util.ArrayList;
import java.util.List;
/**
* @author:b.liang
* @date:2023/4/24/9:48
*/
//目标类
public class SupperObject {
//持有的观察者(监听事件的集合)
public List<Observer> observerList = new ArrayList<>();
//定义事件类别
private String supperContent;
//添加事件(观察者)
public void addListener(Observer observer){
observerList.add(observer);
}
//删除事件(观察者)
public void removeListener(Observer observer){
observerList.remove(observer);
}
protected void onClick() {
//循环所有的注册的观察者
for (Observer o:observerList
) {
if ("Button".equals(this.getSupperContent())){
if ("按钮1".equals(o.getObserverName())){
o.onclick(this);
}
}if ("Text".equals(this.getSupperContent())){
if ("文本1".equals(o.getObserverName())){
o.onclick(this);
}
}
}
}
public String getSupperContent() {
return supperContent;
}
public void setSupperContent(String supperContent) {
this.supperContent = supperContent;
this.onClick(); //通知 区别对待观察者
}
}
核心点是在循环注册的观察者中去对它进行判断,通过onClick的类型来对他进行判断
如果类型符合进去了在判断注册观察者的名字来确实具体的,从而实现了类似那种单目事件的效果,有兴趣的朋友们可以通过注解跟类加载方式配合java中的反射来获取也可以达到类似的效果,从而使的这个观察者更加的简单