zoukankan      html  css  js  c++  java
  • Observer观察者模式

    首先 我们先要知道,观察者模式中主要有观察者被观察者2个对象,而在观察模式中Observable表示被观察者,由于这个对象是一个抽象类只能被继承。而Observer表示观察者,它并不是一个类而是一个接口,所以观察者可以有多个,实现了该接口的类都属于观察者。

    当然有人会问既然被观察者是一个抽象类而观察者是一个接口,那么是否有一个类即继承Observable类又实现Observer接口呢,这个自然可以,观察者当然也可以同时是被观察者,被观察者同样可以是观察者,在这里完全不冲突。

    被观察者(Observable)与观察者(Observer
         当某一个我们需要被观察的对象继承自Observable类时,就表示该类可以被很多观察者(实现了Observer)观察,其实意思就是说这个对象也就是被观察者“上电视了”,电视前的你也就是观察者可以看,(对象发生变化)电视里被观察者做了别的动作,那么电视前的所有人看到的也就变了,在同一时间改变所有观众看到的画面。

    实例:
    1,新建MyPerson继承自Observable,表示该类为 "被观察者"
    public class MyPerson extends Observable {
     
        private int age;
        private String name;
        private String sax;
         
        public int getAge() {
            return age;
        }
     
        public void setAge(int age) {
            this.age = age;
            setChanged();
            notifyObservers();
        }
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
            setChanged();
            notifyObservers();
        }
     
        public String getSax() {
            return sax;
        }
     
        public void setSax(String sax) {
            this.sax = sax;
        }
     
        @Override
        public String toString() {
            return "MyPerson [age=" + age + ", name=" + name + ", sax=" + sax + "]";
        }
    }

    注意到:setChanged();notifyObservers();多了这两句调用,而这里就是解决问题二所在,它通过setChanged();告知数据改变,通过notifyObservers();发送信号通知观察者。

    2,MyObserver是观察者:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public class MyObserver implements Observer {
         
        private int i;
        private MyPerson myPerson;//观察的对象
         
        public MyObserver(int i){
            System.out.println("我是观察者---->" + i);
            this.i = i;
        }
     
        public int getI() {
            return i;
        }
     
        public void setI(int i) {
            this.i = i;
        }
     
        public MyPerson getMyPerson() {
            return myPerson;
        }
     
        public void setMyPerson(MyPerson myPerson) {
            this.myPerson = myPerson;
        }
     
        @Override
        public void update(Observable observable, Object data) { //如果被观察者 数据发生了改变,这回进入这update中
            System.out.println("观察者---->"+ i +"得到更新!");
            this.myPerson = (MyPerson)observable;
            System.out.println(((MyPerson)observable).toString());
        }
     
    }

     
     这里我们看到,实现了Observer,只有一个update方法,那么这个方法什么时候被调用呢,很显然,在上面我们有通知的信号,那么这里就是接受到信号后执行的动作。
     
    3,MainActivity
    1. package com.example.mobservermode;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. import android.app.Activity;
    5. import android.os.Bundle;
    6. import android.os.Handler;
    7. import android.os.Message;
    8. import android.view.View;
    9. import android.view.View.OnClickListener;
    10. import android.view.ViewGroup;
    11. import android.widget.BaseAdapter;
    12. import android.widget.Button;
    13. import android.widget.ListView;
    14. import android.widget.TextView;
    15. public class MainActivity extends Activity {
    16. private Button btn_add;
    17. private Button btn_update;
    18. private ListView lv;
    19. private int i = 1;
    20. //观察者集合
    21. private List<MyObserver> list=new ArrayList<MyObserver>();
    22. //被观察者
    23. private MyPerson observable;
    24. private Handler handler = new Handler(new Handler.Callback() {
    25. @Override
    26. public boolean handleMessage(Message msg) {
    27. // 将信息加入list中显示
    28. MyAdapter myListAdapter = new MyAdapter();
    29. lv.setAdapter(myListAdapter);
    30. return false;
    31. }
    32. });
    33. @Override
    34. protected void onCreate(Bundle savedInstanceState) {
    35. super.onCreate(savedInstanceState);
    36. setContentView(R.layout.activity_main);
    37. observable = new MyPerson();
    38. lv=(ListView) findViewById(R.id.lv);
    39. btn_add=(Button) findViewById(R.id.btn_add);
    40. btn_update=(Button) findViewById(R.id.btn_update);
    41. btn_add.setOnClickListener(new OnClickListener() {
    42. @Override
    43. public void onClick(View v) {
    44. MyObserver myObserver = new MyObserver(i);
    45. i++;
    46. observable.addObserver(myObserver);
    47. list.add(myObserver);
    48. handler.sendEmptyMessage(0);
    49. }
    50. });
    51. btn_update.setOnClickListener(new OnClickListener() {
    52. @Override
    53. public void onClick(View v) {
    54. observable.setAge(10 + i);
    55. observable.setName("a" + i);
    56. observable.setSex("男" + i);
    57. handler.sendEmptyMessage(0);
    58. }
    59. });
    60. }
    61. private class MyAdapter extends BaseAdapter{
    62. @Override
    63. public int getCount() {
    64. return list.size();
    65. }
    66. @Override
    67. public Object getItem(int position) {
    68. return list.get(position);
    69. }
    70. @Override
    71. public long getItemId(int position) {
    72. return position;
    73. }
    74. @Override
    75. public View getView(int position, View convertView, ViewGroup parent) {
    76. TextView tv = new TextView(MainActivity.this);
    77. tv.setTextSize(15);
    78. String personContent = "内容还没添加";
    79. if (list.get(position).getMyPerson() != null) {
    80. personContent = list.get(position).getMyPerson().toString();
    81. }
    82. tv.setText("观察者ID:------>" + list.get(position).getI() + " "
    83. + "观察内容:" + personContent);
    84. return tv;
    85. }
    86. }
    87. }









    附件列表

      qq3061280@163.com
    • 相关阅读:
      array_intersect、array_intersect_key、array_intersect_assoc、array_intersect_ukey、array_intersect_uassoc 的用法
      array_diff、array_diff_key、array_diff_ukey、array_diff_assoc、array_diff_uassoc 的用法
      Cannot set headers after they are sent to the client
      zepto+mui开发中的tap事件重复执行
      64位Win7中7zip无法关联文件的问题
      两种好用的清除浮动的小技巧(clearfix hack)
      apache2.4.35 403 forbidden 解决办法
      IETester for IE11, IE10, IE9, IE8, IE7 IE 6 and IE5.5 on Windows 8 desktop, Windows 7, Vista and XP
      清除display:inline-block元素换行符间隙font-size:0;
      环形文字 + css3制作图形 + animation无限正反旋转的一个小demo
    • 原文地址:https://www.cnblogs.com/aibuli/p/05181b44fdd79a7ee58a8d79e2c95c92.html
    Copyright © 2011-2022 走看看