设计模式 观察者模式 以Android中TextView文本内容发生变化为背景

Posted zhangjiaofa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 观察者模式 以Android中TextView文本内容发生变化为背景相关的知识,希望对你有一定的参考价值。

先来看看观察者模式的定义:

定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。

好了,对于定义的理解总是需要实例来解析的,如今的微信服务号相当火啊,下面就以微信服务号为背景,给大家介绍观察者模式。

看一张图:

其中每个使用者都有上图中的3条线,为了使图片清晰省略了。

如上图所示,服务号就是我们的主题,使用者就是观察者。现在我们明确下功能:

1、服务号就是主题,业务就是推送消息

2、观察者只需要订阅主题,只要有新的消息就会送来

3、当不想要此主题消息时,取消订阅

4、只要服务号还在,就会一直有人订阅

好了,现在我们来看看观察者模式的类图:



接下来以android中的TextView文本发生变化的消息的订阅与发布为例子

首先开始写我们的主题接口,和观察者接口:

1、主题接口:

package com.zhangjiaofa.textviewlistenerdemo;

public interface Subject 

	public void registerObserver(Observer observer);
	public void removeObserver(Observer observer);
	public void notifyObservers();


2、观察者接口:

package com.zhangjiaofa.textviewlistenerdemo;

public interface Observer 

	public void update(String description);


接下来文本标签发生变化,消息发布控制器的的实现类:

package com.zhangjiaofa.textviewlistenerdemo;

import java.util.ArrayList;
import java.util.List;

import android.widget.TextView;

public class ObserverForTextView implements Subject 

	private TextView mTextView = null;
	private List<Observer> mObserverList = new ArrayList<Observer>();
	
    public ObserverForTextView(TextView textView) 
    	mTextView = textView;
    
    
	@Override
	public void registerObserver(Observer observer) 
		mObserverList.add(observer);
	

	@Override
	public void removeObserver(Observer observer) 
		int index = mObserverList.indexOf(observer);
        if (index >= 0) 
        	mObserverList.remove(index);
        
	

	@Override
	public void notifyObservers() 
		for (Observer observer : mObserverList) 
			observer.update(mTextView.getText().toString());
		
	
	
	public void comeInNewMessage(String message) 
		mTextView.setText(message);
		notifyObservers();
	



最后,一个实现订阅接口的实体类:

package com.zhangjiaofa.textviewlistenerdemo;

import android.util.Log;

public class ObserverA implements Observer 

	private Subject mSubject = null;

	public ObserverA(Subject subject) 
		mSubject = subject;
		mSubject.registerObserver(this);
	

	@Override
	public void update(String description) 
		Log.v("jfzhang2", "reveive new message : " + description);
	



在MainActivity中测试如下:

package com.zhangjiaofa.textviewstrategydemo;

import com.zhangjiaofa.textviewlistenerdemo.ObserverA;
import com.zhangjiaofa.textviewlistenerdemo.ObserverForTextView;

import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;

public class MainActivity extends Activity 

	private TextView mTextView = null;
	private ObserverForTextView mObserverForTextView = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) 
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mTextView = (TextView) findViewById(R.id.test);
		mObserverForTextView = new ObserverForTextView(mTextView);
		new ObserverA(mObserverForTextView);
		mObserverForTextView.comeInNewMessage("Hello World");
	



可以看出:当给文本标签设置了新的文本内容的时候,凡是订阅了此类消息的实体类对象,均能够收到消息的回调。

点击下载资源

以上是关于设计模式 观察者模式 以Android中TextView文本内容发生变化为背景的主要内容,如果未能解决你的问题,请参考以下文章

Android中观察者模式的升入理解

java/android 设计模式学习笔记---观察者模式

Android开发模式之观察者模式

Android常用设计模式

Android设计模式-观察者模式

Android设计模式-观察者模式