目录
Java设计模式:观察者或发布/订阅模式
一、ModeOne
二、ModeOne
三、百度云下载(CSDN太坑了,一律资源5分)
说明:第一种是目标对象直接与观察者关联,当目标自身发生变化时,会主动通知所有观察者更新他们自身的信息,所以同时
观察的加入和退出都是由目标对象操作
one、IAim.java
package ModeOne;
/**
* 观察者的目标,即被观察者
* T代表待定义的消息对象
*/
public interface IAim {
/**
* 当被观察者发生数据变化的时候通知观察者:数据变更
*/
void notifyDataUpdate(T t);
/**
* 添加想要观测目标的观察者对象
*/
void addObserver(IObserver observer);
/**
* 移除不想观测目标的观察者对象
*/
void removeObserver(IObserver observer);
}
two、IObserver.java
package ModeOne;
/**
* 观察者对象,观察目标的变化更新信息
*/
public interface IObserver {
void updateData(T t);
}
three、各自的实现类以及调用
package ModeOne;
import msg.Message;
import java.util.ArrayList;
import java.util.List;
/**
* 具体的消息目标对象
*/
public class InfoAim implements IAim {
private List 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 {
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);
}
one、IAim.java
package ModeTwo;
/**
* 观察者的目标,即被观察者
* T代表待定义的消息对象
*/
public interface IAim {
/**
* 当被观察者发生数据变化的时候通知观察者:数据变更
*/
void notifyDataUpdate(T t,IMid mid);
}
two、IObserver.java
package ModeTwo;
import msg.Message;
/**
* 具体的消息观察者对象
*/
public class InfoObserver implements IObserver {
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 {
void notifyAllObserver(T t);
void hadObserverBind(IObserver observer);
void hadObserverUnbind(IObserver observer);
}
four、各自实现和调用
package ModeTwo;
import msg.Message;
/**
* 具体的消息目标对象
*/
public class InfoAim implements IAim {
@Override
public void notifyDataUpdate(Message message, IMid mid) {
mid.notifyAllObserver(message);
}
}
//---------------------------------------------------------------
package ModeTwo;
import msg.Message;
/**
* 具体的消息观察者对象
*/
public class InfoObserver implements IObserver {
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 {
private List 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 模式二努力吧...
}
链接:https://pan.baidu.com/s/1MKewX33yIctBuaNTic48nA
提取码:wpci