观察者模式模拟实现

package com.hm.demo;

import java.util.ArrayList;
import java.util.List;

/**
 * 你自己
 * 它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
 */
public abstract class Subject {
    private List<Observer> observers = new ArrayList<>();

    public void attach(Observer observer) {
        observers.add(observer);
        System.out.println("我新交了女朋友:"+observer.getName());
    }

    public void  dettach(Observer observer) {
        observers.remove(observer);
        System.out.println("我和 "+observer.getName() +" 分手了");

    }

    /**
     * 通知更新所有状态
     * @param state
     */
    public void notifyALl(String state) {
        for (Observer observer : observers) {
            observer.update(state);

        }
    }

}

以上为抽象主题,在抽象主题中有一个List是用来存放观察者的,attach和dettach分别是增加删除观察者。notifyALl是用来遍历所有观察者,并给他们发送最新状态。

由于这个是抽象的主题,所以我们需要new对象就必须创建一个正常的类并继承这个抽象主题类,里面就只有一个update方法,直接调用抽象主题的notifyALl方法。

package com.hm.demo;

/**
 * 将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
 */
public class MessageSubject extends Subject {

    public void update(String state) {
        notifyALl(state);
    }
}

在观察者定义update接口,并且定义getName的接口,用来给具体观察者传入姓名

package com.hm.demo;

/**
 * 你女朋友
 * 为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
 */
public interface Observer {
    String getName();
    void update(String state);
}

具体观察者实现接口

package com.hm.demo;

/**
 * 具体某个女朋友
 * 实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
 */
public class GFObserver implements Observer{
    private String name;

    public String getName() {
        return name;
    }

    public GFObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(String state) {
        System.out.println(this.name + "接收到新消息,男朋友最新状态:" + state);
    }
}

package com.hm.demo;

public class Client {
    public static void main(String[] args) {
        Observer sunnyObserver = new GFObserver("sunny");
        Observer maryObserver = new GFObserver("mary");
        MessageSubject subject = new MessageSubject();

        subject.attach(sunnyObserver);
        subject.attach(maryObserver);

        subject.update("我在写代码");
        subject.dettach(maryObserver);
        subject.update("我在睡觉");
    }
}

在这里插入图片描述
观察者模式的实现大概是这样的思路:
首先是抽象主题持有一个list,这个list存着所有的观察者(你的所有女朋友),你可以在这里增加删除你的女朋友,这里你还需要向你所有女朋友汇报你的最新状态,遍历list,调用update接口。
然后在具体的女朋友那里实现update方法,那么你发出的最新状态就能在具体的女朋友那里实现update方法中接收到。感觉这个就是接口回调的一个实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sunywz

~

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

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

打赏作者

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

抵扣说明:

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

余额充值