温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

观察者的使用

发布时间:2020-08-02 01:26:09 来源:网络 阅读:551 作者:海太帅 栏目:移动开发

观察者模式

二话不说,上来就是定义

定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新

这个好像还好理解那么一点点,不过还是先来讲个情景,

天气预报的短信服务,一旦付费订阅,每次天气更新都会向你及时发送

其实就是我们无需每时每刻关注我们感兴趣的东西,我们只需要订阅它即可,一旦我们订阅的事务有变化了,被订阅的事务就会即时的通知我们

我们来看一下观察者模式的组成:


  • 观察者,我们称它为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<HashMap<ObjectSerType, ObjectServer>> ObjectServerList = new ArrayList<HashMap<ObjectSerType, ObjectServer>>();


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<ObjectSerType, ObjectServer> map = new HashMap<ObjectSerType, ObjectServer>();

map.put(type, obj);

ObjectServerList.add(map);

Log.e("", "ObjectServerList>>>" + ObjectServerList);

}

}


@Override

public void remove(ObjectSerType type, ObjectServer obj) {

for (HashMap<ObjectSerType, ObjectServer> map : ObjectServerList) {

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<ObjectSerType, ObjectServer> map = ObjectServerList.get(i);

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时注销观察者。该观察者完成使命
观察者的使用


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI