观察者模式---特殊版

文章介绍了如何通过在目标类中添加条件判断,使得观察者模式能够更精确地通知特定类型的观察者。具体实现包括定义观察者接口、实现接口的ConcreteObserver类以及包含事件列表的目标类SupperObject。通过对事件类型的判断和观察者名字的匹配,实现了针对不同观察者的差异化通知。
摘要由CSDN通过智能技术生成

观察者模式—特殊版

有时候我们使用观察者模式会通知所有的观察者来一起操作这样子不是特别的好,所以我们通过在目标类那里加上条件判断该类事件需要通知哪一类的观察者首先我们定义一个观察者接口

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中的反射来获取也可以达到类似的效果,从而使的这个观察者更加的简单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我老猿猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值