前段時間遇到一個一對多發(fā)消息的需求窍荧,想了想就選擇自己寫一個觀察者模式來實現(xiàn)应又,下面我們分解出五個簡單的類說一下:
一個發(fā)送室向兩個房間發(fā)消息
1.SubjectManager事件注冊元扔,刪除和消息分發(fā)使用
2.IObserverListener用于回調(diào)更新消息
3.SendingRoomActivity發(fā)送室
4.RoomOneActivity第一個房間孕锄,實現(xiàn)IObserverListener接口
5.RoomTwoActivit第二個房間迹冤,實現(xiàn)IObserverListener接口
下圖是我們發(fā)送消息內(nèi)容是123456入挣,其它兩個房間都能收到
微信截圖_20180812145519.png
看一下代碼如下:
- 先看一下SubjectManager文件,詳細(xì)注釋說明
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;
}
/**
* 發(fā)送消息
*
* @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);
}
}
/**
* 分發(fā)消息
*/
private void notifyAlls() {
for (IObserverListener observer : observerList) {
if (observer != null) {
observer.update(mMsg);
}
}
}
}
- 然后是接口IObserverListener
public interface IObserverListener {
void update(String msg);
}
- SendingRoomActivity類直接調(diào)用sendMsg發(fā)消息
btn_tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//發(fā)送消息
SubjectManager.getInstance().sendMsg(content_et == null ? "" : content_et.getText().toString());
}
});
- RoomOneActivity和RoomTwoActivity分別是兩個房間內(nèi)容一樣
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);
}
}
其實主要是把所有觀察者注冊到消息管理里面嚣州,如果有新消息了就分發(fā)到各個觀察者模塊鲫售,主要是理解原理!