源码下载地址:http://download.csdn.net/detail/fkgjdkblxckvbxbgb/9731520


观察者模式 是一种非常经典 非常常用的设计模式。
一个对象的行为 依赖于 另一个对象的状态。
或者换一种说法,当被观察对象(目标对象)的状态发生改变时 ,会直接影响到观察对象的行为。
特点一 : 被观察者 和观察者 一般是 一对多的关系,一个被观察者 对应多个观察者,当一个被观察者的状态发生改变时,被观察者通知观察者, 然后可以在观察者内部 进行业务逻辑的处理。
特点二 : 观察者和被观察者是松耦合的,分别可以各自独立改变
特点三 : 被观察者可以自己决定订阅是否接受通知



写个有趣的例子, 唐僧师徒去取经,唐僧遇险,徒弟来救(看个图,无图说毛啊)


画了一个分解图,结合代码,一看就懂



代码比较清晰,看完最好自己敲一遍.加深理解

界面代码

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);
}
}


obSerView 主要用来更新界面信息.里面就一个方法

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("========>>悟空来了");
}
}








更多相关文章

  1. GenericObjectPool对象池异常排查
  2. Java对象创建的过程及对象的内存布局与访问定位
  3. request对象和response对象
  4. 20162305 实验二 Java面向对象程序设计 实验报告
  5. Java类的加载和对象创建流程的详细分析
  6. Java第三次作业——面向对象基础(封装)
  7. NullPointerException: android.support.v4.app.FragmentHostCal
  8. 如何将.net DateTime作为json字符串解析为java的Date对象
  9. 【android】两个view共用同一个animation对象的问题

随机推荐

  1. 程序猿(媛)Shell脚本必备技能之一: 在Lin
  2. ThinkPHP2.1 读取SqlServer数据(并解决Sql
  3. 将MySQL用于OUTFILE以生成Excel可读的UTF
  4. 如何构建一个命令来连接mySQL中的3个不同
  5. 161205、win10安装mysql5.7.16数据库
  6. PHP数据库类的封装
  7. docker mysql authentication_string cli
  8. MySQL + KeepAlived + LVS 单点写入主主
  9. python pymysql连接数据库pymysql.err.Op
  10. ERROR 2002 (HY000): Can't connect to l