您的位置:首页 > 编程语言 > Java开发

java设计模式——观察者模式

2016-02-20 20:23 176 查看
观察者模式也是我们平时编码时用的非常多的一种设计模式,有点回调的意味,但是回调是一对一,它可以实现一对多。我们平时用的UI控件的点击事件,滑动事件,现在很流行的响应式编程,还有现在很流行的Rxjava等非常好的开发框架中都有它的影子。

其实特别对于移动端开发来说,这种设计模式是非常非常重要的,因为当我们订阅了一个事件之后,我们就不用管它了,去做别的事情,它会自动完成我们订阅的事件,等它完成之后,在来通知我们,这样我们就不用一直等着一个事件的完成而浪费时间。对与移动端来讲,这种对用户的体验是非常好的。

比如我们现在在网上订餐,我们下单之后就相当于我们在这个饭馆订阅了一个事件,然后我们就不用管了,该干嘛干嘛去,饭馆呢,就会给我们做饭,做好之后让送餐员给我们送过来,这时候我们收到饭就可以吃了。。。

下面 我们用这个列子来编写一下代码:

第一步订餐接口 :餐馆的订餐后台都去它那下单

package chs.com.text;

/**
* Created by Administrator on 2016/2/20.
* 所有餐馆都得实现这个
*/
public interface Restaurant {
/**
* 注册一个观察者
* @param observer
*/
public void registerObserver(Observer observer);
/**
* 移除一个观察者
* @param observer
*/
public void removeObserver(Observer observer);

/**
* 通知所有的观察着
*/
public void notifyObservers();
}


第二步订餐人需要实现的

package chs.com.text;

/**
* Created by Administrator on 2016/2/20.
* 所有订餐的都实现这个接口方便送餐
*/
public interface Observer {
public void update(String msg);
}


第三步

package chs.com.text;

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

/**
* Created by Administrator on 2016/2/20.
* 餐馆1实现餐馆的接口
*/
public class Restaurant1 implements Restaurant {
private List<Observer> observers = new ArrayList<>();
private String msg;
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}

@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}

@Override
public void notifyObservers() {
for(Observer observer : observers){
observer.update(msg);
}
}
public void setMsg(String msg){
this.msg = msg;
notifyObservers();
}
}
第四步

package chs.com.text;

import android.util.Log;

/**
* Created by Administrator on 2016/2/20.
* 订餐人实现订餐的接口
*/
public class Observer1 implements Observer {
private Restaurant restaurant;
public String result;
public Observer1(Restaurant restaurant) {
this.restaurant = restaurant;
restaurant.registerObserver(this);
}

@Override
public void update(String msg) {
result = msg;
Log.i("result",msg);
}
}


xml中 我们设置一个按钮和一个文本,点击订餐,当做好之后在文本上显示饭 做好了。



<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="chs.com.text.MainActivity">

<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="订餐" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text=""/>
</RelativeLayout>


MainActivity 订餐

package chs.com.text;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
private TextView textView;
private Observer1 observer1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.tv);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
textView.setText(observer1.result);
}
});
Restaurant1 restaurant1 = new Restaurant1(); //实例化餐馆
observer1 = new Observer1(restaurant1); //订餐人下订单

restaurant1.setMsg("饭做好了");
}
}


最后效果



这里我们只写了一个订餐的人,当然我们可以写多个人,来实现一对多的关系。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: