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

     观察者模式也是我们平时编码时用的非常多的一种设计模式,有点回调的意味,但是回调是一对一,它可以实现一对多。我们平时用的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("饭做好了");
    }
}

最后效果

这里我们只写了一个订餐的人,当然我们可以写多个人,来实现一对多的关系。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值