安卓设计模式之_观察者模式
16lz
2021-01-22
观察者模式 是一种非常经典 非常常用的设计模式。
一个对象的行为 依赖于 另一个对象的状态。
或者换一种说法,当被观察对象(目标对象)的状态发生改变时 ,会直接影响到观察对象的行为。
特点一 : 被观察者 和观察者 一般是 一对多的关系,一个被观察者 对应多个观察者,当一个被观察者的状态发生改变时,被观察者通知观察者, 然后可以在观察者内部 进行业务逻辑的处理。
特点二 : 观察者和被观察者是松耦合的,分别可以各自独立改变
特点三 : 被观察者可以自己决定订阅是否接受通知
public class ObverActivity extends SwipeBackActivity implements
OnClickListener, ObserView {
Button btn_help;
private TextView tv_info;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_observer);
initObserver();
btn_help = (Button) findViewById(R.id.btn_help);
btn_help.setOnClickListener(this);
tv_info = (TextView) findViewById(R.id.tv_info);
builder = new StringBuilder();
}
SubjectManager manager;
private void initObserver() {
manager = new SubjectImpl();
WuKong wukong = new WuKong(this);
Bajie bajie = new Bajie(this);
SaSeng saseng = new SaSeng(this);
manager.addObserver(saseng);
manager.addObserver(bajie);
manager.addObserver(wukong);
}
public void onClick(View v) {
if (v.getId() == R.id.btn_help) {
manager.notifyBody();
}
}
StringBuilder builder;
public void showToast(String text) {
builder.append(text + "\n");
tv_info.setText(builder.toString());
Log.i("main", "======" + text);
}
}
package com.reeman.demo.observer;
public interface ObserView {
void showToast(String text);
}
主界面添加被观察者,移除被观察者,和系统通知方法
package com.reeman.demo.observer;
public interface SubjectManager {
// 添加观察者
void addObserver(Observer mObserver);
// 删除观察者
void delObserver(Observer mObserver);
// 状态改变通知观察者
void notifyBody();
}
既然有接口,就得有实现类
package com.reeman.demo.observer;
import java.util.ArrayList;
import java.util.List;
import android.util.Log;
public class SubjectImpl implements SubjectManager {
private List<Observer> list = new ArrayList<Observer>();
@Override
public void addObserver(Observer mObserver) {
list.add(mObserver);
}
@Override
public void delObserver(Observer mObserver) {
list.remove(mObserver);
}
public void notifyBody() {
if (list != null && list.size() > 0) {
// 遍历观察者,通知到用户
for (Observer mObserver : list) {
mObserver.notifies();
}
}
}
}
观察者接口
package com.reeman.demo.observer;
/**
* 观察者
*
* @author admin_cdl
*
*/
public interface Observer {
// 状态改变,这里接受消息做处理
void notifies();
}
三个观察者(可以更多)
public class Bajie implements Observer {
ObserView mObserView;
public Bajie(ObserView mObserView) {
this.mObserView = mObserView;
}
public void notifies() {
mObserView.showToast("========>>八戒来了");
}
}
public class SaSeng implements Observer {
ObserView mObserView;
public SaSeng(ObserView mObserView) {
this.mObserView = mObserView;
}
public void notifies() {
mObserView.showToast("========>>ɳɮ4");
}
}
public class WuKong implements Observer {
ObserView mObserView;
public WuKong(ObserView mObserView) {
this.mObserView = mObserView;
}
public void notifies() {
mObserView.showToast("========>>悟空来了");
}
}
更多相关文章
- GenericObjectPool对象池异常排查
- Java对象创建的过程及对象的内存布局与访问定位
- request对象和response对象
- 20162305 实验二 Java面向对象程序设计 实验报告
- Java类的加载和对象创建流程的详细分析
- Java第三次作业——面向对象基础(封装)
- NullPointerException: android.support.v4.app.FragmentHostCal
- 如何将.net DateTime作为json字符串解析为java的Date对象
- 【android】两个view共用同一个animation对象的问题