java设计模式——观察者模式
2016-02-20 20:23
176 查看
观察者模式也是我们平时编码时用的非常多的一种设计模式,有点回调的意味,但是回调是一对一,它可以实现一对多。我们平时用的UI控件的点击事件,滑动事件,现在很流行的响应式编程,还有现在很流行的Rxjava等非常好的开发框架中都有它的影子。
其实特别对于移动端开发来说,这种设计模式是非常非常重要的,因为当我们订阅了一个事件之后,我们就不用管它了,去做别的事情,它会自动完成我们订阅的事件,等它完成之后,在来通知我们,这样我们就不用一直等着一个事件的完成而浪费时间。对与移动端来讲,这种对用户的体验是非常好的。
比如我们现在在网上订餐,我们下单之后就相当于我们在这个饭馆订阅了一个事件,然后我们就不用管了,该干嘛干嘛去,饭馆呢,就会给我们做饭,做好之后让送餐员给我们送过来,这时候我们收到饭就可以吃了。。。
下面 我们用这个列子来编写一下代码:
第一步订餐接口 :餐馆的订餐后台都去它那下单
第二步订餐人需要实现的
第三步
xml中 我们设置一个按钮和一个文本,点击订餐,当做好之后在文本上显示饭 做好了。
MainActivity 订餐
最后效果
这里我们只写了一个订餐的人,当然我们可以写多个人,来实现一对多的关系。
其实特别对于移动端开发来说,这种设计模式是非常非常重要的,因为当我们订阅了一个事件之后,我们就不用管它了,去做别的事情,它会自动完成我们订阅的事件,等它完成之后,在来通知我们,这样我们就不用一直等着一个事件的完成而浪费时间。对与移动端来讲,这种对用户的体验是非常好的。
比如我们现在在网上订餐,我们下单之后就相当于我们在这个饭馆订阅了一个事件,然后我们就不用管了,该干嘛干嘛去,饭馆呢,就会给我们做饭,做好之后让送餐员给我们送过来,这时候我们收到饭就可以吃了。。。
下面 我们用这个列子来编写一下代码:
第一步订餐接口 :餐馆的订餐后台都去它那下单
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("饭做好了"); } }
最后效果
这里我们只写了一个订餐的人,当然我们可以写多个人,来实现一对多的关系。
相关文章推荐
- Java 异常
- Struts2 HelloWorld
- java继承,抽象类
- Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
- Java 容器
- Spring MVC 中的 forward 和 redirect 的简单理解
- Struts2之result的配置
- (新手向)spring-boot Gradle installation
- Struts2之Action的基本配置
- Struts2之访问ServletAPI
- Struts2之入门
- LEEDCODE 13 Roman to Integer (JAVA题解)
- EGit with eclipse to clone project from GitHub(Step by step)
- Java-Map测试-学生选课
- Java 排名第一的4个理由
- Java-Set测试-学生选课
- Java数据类型
- Java学习笔记2016.2.20 包装类、数组
- Java-List测试-学生选课
- Java线程-隋唐演义大戏