观察者设计模式举例

综述:达到的效果和startActivityForResult效果差不多,但是是通过观察者设计模式写的。点击A界面进入B界面,点击B界面,A界面数据发生改变。

1、

A界面的清单文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.administrator.watcher.MainActivity">
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="测试文本" />
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tv"
        android:text="跳转" />
</RelativeLayout>

B界面清单文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="刷新数据"/>
</LinearLayout>

2、

//定义观察者,单独的class文件


public interface ObserverListener {
    void observerUpData(String content);
}

3、

// 定义被观察者接口,单独的class文件

public interface SubjectListener {
void add(ObserverListener observerListener);
void notifyObserver(String content);
void remove(ObserverListener observerListener);
}

4、

//观察者管理类

public class ObserverManager implements SubjectListener {
    private static ObserverManager observerManager;
    //观察者接口集合
    private List<ObserverListener> list = new ArrayList<>();
    //单例
    public static ObserverManager getInstance(){
        if (null == observerManager){
            synchronized (ObserverManager.class){
                if (null == observerManager){
                    observerManager = new ObserverManager();
                }
            }
        }
        return observerManager;
    }


    /**
     * 加入监听队列
     */
    @Override
    public void add(ObserverListener observerListener) {
        list.add(observerListener);
    }


    /**
     * 通知观察者刷新数据
     */
    @Override
    public void notifyObserver(String content) {
        for (ObserverListener observerListener : list){
            observerListener.observerUpData(content);
        }
    }


    /**
     * 监听队列中移除
     */
    @Override
    public void remove(ObserverListener observerListener) {
        if (list.contains(observerListener)){
            list.remove(observerListener);
        }
    }

5、

第一个Activity界面

public class MainActivity extends Activity implements ObserverListener {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ObserverManager.getInstance().add(this);// 注册
textView = (TextView) findViewById(R.id.tv);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
@Override
public void observerUpData(String content) {
textView.setText(content);
}
}


//需要移除监听,切记一定要。在OnDestory();方法中添加,不然走多次的话,监听会失效。

6、

第二个activity界面

public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ObserverManager.getInstance().notifyObserver("观察者请刷新信息");
}
});
}
}

PS:当点击第二个界面的时候,第一个界面的数据会发生改变

发布了56 篇原创文章 · 获赞 12 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/huwan12345/article/details/65939006