前段时间遇到一个一对多发消息的需求,想了想就选择自己写一个观察者模式来实现,下面我们分解出五个简单的类说一下:
一个发送室向两个房间发消息
1.SubjectManager事件注册,删除和消息分发使用
2.IObserverListener用于回调更新消息
3.SendingRoomActivity发送室
4.RoomOneActivity第一个房间,实现IObserverListener接口
5.RoomTwoActivit第二个房间,实现IObserverListener接口
下图是我们发送消息内容是123456,其它两个房间都能收到
看一下代码如下:
- 先看一下SubjectManager文件,详细注释说明
public class SubjectManager {
private static ArrayList<IObserverListener> observerList = new ArrayList<>();
private static SubjectManager mManager;
private String mMsg;
public static synchronized SubjectManager getInstance() {
if (mManager == null) {
mManager = new SubjectManager();
}
return mManager;
}
/**
* 发送消息
*
* @param msg
*/
public void sendMsg(String msg) {
this.mMsg = msg;
notifyAlls();
}
/**
* 注册事件
*
* @param observer
*/
public void registrationObserver(IObserverListener observer) {
if (observerList != null && observer != null) {
observerList.add(observer);
}
notifyAlls();
}
/**
* 删除事件
*
* @param observer
*/
public void unregistrationObserver(IObserverListener observer) {
if (observerList != null && observer != null) {
observerList.remove(observer);
}
}
/**
* 分发消息
*/
private void notifyAlls() {
for (IObserverListener observer : observerList) {
if (observer != null) {
observer.update(mMsg);
}
}
}
}
- 然后是接口IObserverListener
public interface IObserverListener {
void update(String msg);
}
- SendingRoomActivity类直接调用sendMsg发消息
btn_tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//发送消息
SubjectManager.getInstance().sendMsg(content_et == null ? "" : content_et.getText().toString());
}
});
- RoomOneActivity和RoomTwoActivity分别是两个房间内容一样
public class RoomOneActivity extends AppCompatActivity implements IObserverListener {
private TextView text_tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_room_one);
text_tv = findViewById(R.id.text_tv);
//注册事件
SubjectManager.getInstance().registrationObserver(this);
}
@Override
public void update(String msg) {
//接收消息
text_tv.setText(msg);
}
@Override
protected void onDestroy() {
super.onDestroy();
//删除事件
SubjectManager.getInstance().unregistrationObserver(this);
}
}
其实主要是把所有观察者注册到消息管理里面,如果有新消息了就分发到各个观察者模块,主要是理解原理!