Android_观察者模式简单Demo

总体流程:

a. 实例化被观察者(单例)

b. 被观察者添加观察者

c. 数据变化后,被观察者调用其notifyWatcher()方法,此方法内容是通知所有观察者数据改变。

d. 观察者接收到数据改变信息后的处理。

实例代码如下:

被观察者接口

public interface Watched {
	//在其接口中定义一个用来增加观察者的方法
	public void add(Watcher watcher);
	//再定义一个用来删除观察者权利的方法
	public void remove(Watcher watcher);
	//再定义一个可以实现行为变现并向观察者传输信息的方法
	public void notifyWatcher(Content content);
}
被观察者实现类

public class ConcreteWatched implements Watched {
	// 定义一个List来封装Watcher
	private List<Watcher> list = new ArrayList<Watcher>();
	@Override
	public void add(Watcher watcher) {
		list.add(watcher);
	}
	@Override
	public void remove(Watcher watcher) {
		list.remove(watcher);
	}
	@Override
	public void notifyWatcher(Content content) {
		for (Watcher watcher : list) {
			watcher.updateNotify(content);
		}
	}
}
观察者接口

public interface Watcher {
	//再定义一个用来获取更新信息接收的方法
	public void updateNotify(Content content);
}
观察者 实现类 ( 一般用在对应的 Activity 直接实现 Watcher 即可 )

public class ConcreteWatcher implements Watcher {
	// 并覆写其方法
	@Override
	public void updateNotify(Content content) {
		// TODO Auto-generated method stub
		int id = content.getId();
		String name = content.getName();
		String address = content.getAddress();
		System.out.println("id:" + id + "/n name:" + name + "/n address:" + address);
	}
}

给出数据模型Content

public class Content {
	private int id;
	private String name;
	private String address;
	public void setId(int id) {
		this.id = id;
	}
	public int getId() {
		return id;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getAddress() {
		return address;
	}
}

实际调用类MainActivity

public class MainActivity extends Activity implements Watcher {
	Handler handler = new Handler();
	TextView tv = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv = (TextView) findViewById(R.id.tv);
		doTest();
	}
	public void doTest() {
		// 实例一个被观察者
		// 使用时可使用单例,在Application中进行
		final Watched watched = new ConcreteWatched();
		//		//实例第一个观察者对被观察者进行观察
		//		Watcher watcher1 = new ConcreteWatcher();
		//		//实例第二个观察者对被观察者进行观察
		//		Watcher watcher2 = new ConcreteWatcher();
		//		//实例第三个观察者对被观察者进行观察
		//		Watcher watcher3 = new ConcreteWatcher();
		//		//加入对其观察
		//		watched.add(watcher1);
		//		watched.add(watcher2);
		//		watched.add(watcher3);
		watched.add(this);
		// 当被观察者发生变化时:调用其信息方法 
		Content content = new Content();
		content.setId(1126);
		content.setName("tjd");
		content.setAddress("suzhou");
		doDataChange(watched, content);
		//		// 被观察者可以调用删除方法
		//		watched.remove(watcher2);
		handler.postDelayed(new Runnable() {
			public void run() {
				Content content = new Content();
				content.setName("wy");
				content.setAddress("xuzhou");
				content.setId(410);
				doDataChange(watched, content);
			}
		}, 5000);
	}
	public void doDataChange(Watched watched, Content content) {
		watched.notifyWatcher(content);
	}
	@Override
	public void updateNotify(Content content) {
		final String s = "mine  id = " + content.getId() + "  name = " + content.getName();
		doShowText(s);
	}
	protected void doShowText(String s) {
		tv.setText(s);
	}
}

本地Demo名备忘:ObserverPattern







  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值