Java设计模式:观察者或发布/订阅模式

目录

Java设计模式:观察者或发布/订阅模式

 一、ModeOne

 二、ModeOne

三、百度云下载(CSDN太坑了,一律资源5分)


Java设计模式:观察者或发布/订阅模式

 一、ModeOne

说明:第一种是目标对象直接与观察者关联,当目标自身发生变化时,会主动通知所有观察者更新他们自身的信息,所以同时

观察的加入和退出都是由目标对象操作

one、IAim.java

package ModeOne;

/**
 * 观察者的目标,即被观察者
 * T代表待定义的消息对象
 */
public interface IAim<T> {

    /**
     * 当被观察者发生数据变化的时候通知观察者:数据变更
     */
    void notifyDataUpdate(T t);

    /**
     * 添加想要观测目标的观察者对象
     */
    void addObserver(IObserver observer);


    /**
     * 移除不想观测目标的观察者对象
     */
    void removeObserver(IObserver observer);
}

two、IObserver.java

package ModeOne;

/**
 * 观察者对象,观察目标的变化更新信息
 */
public interface IObserver<T> {
    void updateData(T t);
}

three、各自的实现类以及调用

package ModeOne;

import msg.Message;

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

/**
 * 具体的消息目标对象
 */
public class InfoAim implements IAim<Message> {
    private List<IObserver> observers;

    public InfoAim() {
        observers = new ArrayList<>();
    }

    @Override
    public void notifyDataUpdate(Message message) {
        for (IObserver observer : observers) {
            observer.updateData(message);
        }
    }

    @Override
    public void addObserver(IObserver observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(IObserver observer) {
        observers.remove(observer);
    }
}

//----------------------------------------------------------

package ModeOne;

import msg.Message;

/**
 * 具体的消息观察者对象
 */
public class InfoObserver implements IObserver<Message> {
    private String name;

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


    @Override
    public void updateData(Message message) {
        System.out.println("observer " + name + " receive new msg is " + message.getInfos());
    }
}

//------------------------------------------------------------

  public static void main(String[] args) {
    /*
        todo question is 这个是目标主动移除观察者,而不是观察者主动取消观察的 and 也是目标主动添加观察者的
        */

        //创建目标对象
        IAim aim = new InfoAim();
        //引入观察者对象
        IObserver observer1 = new InfoObserver("观察者one");
        //绑定观察者
        aim.addObserver(observer1);
        IObserver observer2 = new InfoObserver("观察者two");
        aim.addObserver(observer2);
        IObserver observer3 = new InfoObserver("观察者three");
        aim.addObserver(observer3);
        //目标改变通知
        Message message = new Message();
        message.setInfos("每天都是发财的日子啦...");
        aim.notifyDataUpdate(message);
        //移除观察者one
        aim.removeObserver(observer2);
        //发送更新消息
        Message updateMsg = new Message();
        updateMsg.setInfos("努力努力再努力吧...");
        aim.notifyDataUpdate(updateMsg);
  }

 二、ModeOne

one、IAim.java

package ModeTwo;

/**
 * 观察者的目标,即被观察者
 * T代表待定义的消息对象
 */
public interface IAim<T> {

    /**
     * 当被观察者发生数据变化的时候通知观察者:数据变更
     */
    void notifyDataUpdate(T t,IMid mid);
}

two、IObserver.java

package ModeTwo;

import msg.Message;

/**
 * 具体的消息观察者对象
 */
public class InfoObserver implements IObserver<Message> {
    private String name;

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


    @Override
    public void updateData(Message message) {
        System.out.println("observer " + name + " receive new msg is " + message.getInfos());
    }

    @Override
    public void bindToAim(IMid mid) {
        mid.hadObserverBind(this);
    }

    @Override
    public void unBindFromAim(IMid mid) {
        mid.hadObserverUnbind(this);
    }
}

three、IMid.java

package ModeTwo;

/**
 * 目标与观察者之间的中间对象
 */
public interface IMid<T> {

    void notifyAllObserver(T t);

    void hadObserverBind(IObserver observer);

    void hadObserverUnbind(IObserver observer);
}

four、各自实现和调用

package ModeTwo;

import msg.Message;

/**
 * 具体的消息目标对象
 */
public class InfoAim implements IAim<Message> {

    @Override
    public void notifyDataUpdate(Message message, IMid mid) {
        mid.notifyAllObserver(message);
    }
}

//---------------------------------------------------------------

package ModeTwo;

import msg.Message;

/**
 * 具体的消息观察者对象
 */
public class InfoObserver implements IObserver<Message> {
    private String name;

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


    @Override
    public void updateData(Message message) {
        System.out.println("observer " + name + " receive new msg is " + message.getInfos());
    }

    @Override
    public void bindToAim(IMid mid) {
        mid.hadObserverBind(this);
    }

    @Override
    public void unBindFromAim(IMid mid) {
        mid.hadObserverUnbind(this);
    }
}

//---------------------------------------------------------

package ModeTwo;

import msg.Message;

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

public class InfoMid implements IMid<Message> {

    private List<IObserver> observers;

    public InfoMid() {
        observers = new ArrayList<>();
    }

    @Override
    public void notifyAllObserver(Message message) {
        for (IObserver observer : observers) {
            observer.updateData(message);
        }
    }

    @Override
    public void hadObserverBind(IObserver observer) {
        observers.add(observer);
    }

    @Override
    public void hadObserverUnbind(IObserver observer) {
        observers.remove(observer);
    }
}

//-----------------------------------------------------


    public static void main(String[] args) {
        /*
         * 这也是发布/订阅模式
         * */

        //创建目标对象
        ModeTwo.IAim newAim = new ModeTwo.InfoAim();
        //中间桥梁
        IMid mid = new InfoMid();
        //引入观察者对象
        ModeTwo.IObserver observerOne = new ModeTwo.InfoObserver("观察者one");
        //主动观测目标
        observerOne.bindToAim(mid);
        ModeTwo.IObserver observerTwo = new ModeTwo.InfoObserver("观察者two");
        observerTwo.bindToAim(mid);
        ModeTwo.IObserver observerThree = new ModeTwo.InfoObserver("观察者three");
        observerThree.bindToAim(mid);
        //更新消息
        Message messageOne = new Message();
        messageOne.setInfos("模式二发财啦...");
        newAim.notifyDataUpdate(messageOne, mid);

        //移除观察者Three
        observerThree.unBindFromAim(mid);
        Message messageTwo = new Message();
        messageTwo.setInfos("模式二努力吧...");
        newAim.notifyDataUpdate(messageTwo, mid);

        //-----------------------控制台结果展示如下----------------------
//        observer 观察者two receive new msg is 每天都是发财的日子啦...
//        observer 观察者three receive new msg is 每天都是发财的日子啦...
//        observer 观察者one receive new msg is 努力努力再努力吧...
//        observer 观察者three receive new msg is 努力努力再努力吧...
//        ==================================================
//        observer 观察者one receive new msg is 模式二发财啦...
//        observer 观察者two receive new msg is 模式二发财啦...
//        observer 观察者three receive new msg is 模式二发财啦...
//        observer 观察者one receive new msg is 模式二努力吧...
//        observer 观察者two receive new msg is 模式二努力吧...
    }

三、百度云下载(CSDN太坑了,一律资源5分)

链接:https://pan.baidu.com/s/1MKewX33yIctBuaNTic48nA 
提取码:wpci 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值