十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
观察者模式
为金州等地区用户提供了全套网页设计制作服务,及金州网站建设行业解决方案。主营业务为成都网站设计、做网站、金州网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!二话不说,上来就是定义
定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新
这个好像还好理解那么一点点,不过还是先来讲个情景,
天气预报的短信服务,一旦付费订阅,每次天气更新都会向你及时发送
其实就是我们无需每时每刻关注我们感兴趣的东西,我们只需要订阅它即可,一旦我们订阅的事务有变化了,被订阅的事务就会即时的通知我们
我们来看一下观察者模式的组成:
观察者,我们称它为Observer,有时候我们也称它为订阅者,即Subscriber
被观察者,我们称它为Observable,即可以被观察的东西,有时候还会称之为主题,即Subject
至于观察者模式的具体实现,java里为我们提供了Observable类和Observer接口供我们快速实现该模式,但是这里为了加深印象,不用这个两个类,以下是观察者模式的代码实现:
1、首先我们定义一个的接口,里面是观察者需要做的三件事:
public interface ObjectAble {
public void add(ObjectSerType type, ObjectServer obj);//添加订阅
public void remove(ObjectSerType type, ObjectServer obj);//取消订阅
void notifyDataChange(ObjectSerType type, Object... objs);//发送订阅内容
}
2、当主题发生变化的时候,需要通知观察者来做出响应,还需要一个onRecever方法,具体实现如下
public interface ObjectServer {
void onRecever(Object...obj);
}
3、定义观察者类型的枚举类,这是表示观察者的类型,当触发ObjectAble 接口中的notifyDataChangee(ObjectSerType type, Object... objs)方法时,即主题发生变化,所有类型为type的已订阅的观察者会被触发。
package com.example.testobjectserver;
public enum ObjectSerType{
a,b,c,d
}
4、实现ObjectAble接口,为每个方法添加逻辑
package com.example.testobjectserver;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.util.Log;
public class ObjectAbleImpelet implements ObjectAble {
public static ArrayList
static ObjectAbleImpelet instance = null;
public static ObjectAbleImpelet getInstance() {
synchronized (ObjectAbleImpelet.class) {
if (instance == null)
instance = new ObjectAbleImpelet();
}
return instance;
};
@Override
public void add(ObjectSerType type, ObjectServer obj) {
if (type == null && obj == null)
throw new NullPointerException("ObjectSerType or ObjectServer can not null");
synchronized (ObjectServerList) {
HashMap
map.put(type, obj);
ObjectServerList.add(map);
Log.e("", "ObjectServerList>>>" + ObjectServerList);
}
}
@Override
public void remove(ObjectSerType type, ObjectServer obj) {
for (HashMap
Log.e("", "type>>>" + type);
if(map.get(type).equals(obj)){
ObjectServerList.remove(map);
Log.e("", "obj>>>" + obj);
break;
}
}
}
@Override
public void notifyDataChange(ObjectSerType type, Object... objs) {
for (int i = 0; i < ObjectServerList.size(); i++) {
HashMap
if (map.containsKey(type)) {
map.get(type).onRecever(objs);
}
}
}
}
5、测试:
package com.example.testobjectserver;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity extends Activity implements ObjectServer {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ObjectAbleImpelet.getInstance().add(ObjectSerType.a, this);//添加订阅,类型为ObjectSerType.a, 类型由开发者定义
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ObjectAbleImpelet.getInstance().notifyDataChange(
ObjectSerType.a, "你好");//主题发生变化,触 //发所有类型为ObjectSerType.a的观察者调用onRecever方法
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//主题变化后,观察者的回调
@Override
public void onRecever(Object... obj) {
Log.e("", "我是观察者!!!" + (String) obj[0]);
((TextView) findViewById(R.id.textView1)).setText("" + (String) obj[0]);
}
@Override
protected void onDestroy() {
//无论如何,当退出activity,该activity中的观察者需要被回收,不然会导致观察者容器中的观察者
//对象越来越多
ObjectAbleImpelet.getInstance().remove(ObjectSerType.a, this);
super.onDestroy();
}
}
6、如下图所示:进入activity注册类型为a的观察者,当点击按钮,触发onRecive回调,更新ui;退出activity时注销观察者。该观察者完成使命
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。