首页 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
移动开发 架构设计 编程语言 Web前端 互联网
开发杂谈 系统运维 研发管理 数据库 云计算 Android开发资料
资讯 业界资讯 软件杂谈 编程开发 网站建设 网络观查 搜索引擎 移动应用 网站运营 网络地图
开发 移动开发 Web前端 架构设计 编程语言 互联网 数据库 系统运维 云计算 开发杂谈
[互联网] 观察者模式修改
观察者模式修改

状况:遇到android程序中后入栈的一个Activity需要更新之前一个或者两个以上Activity中的数据时使用,或者需要在adapter中修改Activity或者fragment的数据和ui等

[1].[代码] [Java]代码 跳至 [1]


?

1
2
3
4
5
6
7
8
9
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158

//观察者,需要用到观察者模式的类需实现此接口
public interface Observer {
    void update(Object... objs);
}
//被观察者(一个抽象类,方便扩展)
public abstract class Observable {
    
    public final ArrayList<Class<?>> obserList = new ArrayList<Class<?>>();
    
    /** Attach Observer (通过实例注册观察者)
     * <b>Notice:</b> ob can't be null ,or it will throw NullPointerException
     * */
    public <T> void registerObserver(T ob) {
        if (ob == null) throw new NullPointerException();
        this.registerObserver(ob.getClass());
    }

    /**
     * Attach Observer(通过Class注册观察者)
     * @param cls
     */
    public void registerObserver(Class<?> cls) {
        if (cls == null) throw new NullPointerException();
        synchronized(obserList) {
            if (!obserList.contains(cls)) {
                obserList.add(cls);
            }
        }
    }
    
    /** Unattach Observer (注销观察者)
     * <b>Notice:</b> 
     * <b>It reverses with attachObserver() method</b>
     * */
    public <T> void unRegisterObserver(T ob) {
        if (ob == null) throw new NullPointerException();
        this.unRegisterObserver(ob.getClass());
    }
    
    /** Unattach Observer(注销观察者,有时候在未获取到实例使用)
     * <b>Notice:</b> 
     * <b>It reverses with attachObserver() method</b>
     * */
    public void unRegisterObserver(Class<?> cls) {
        if(cls == null) throw new NullPointerException();
        synchronized(obserList){
            Iterator<Class<?>> iterator = obserList.iterator();
            while(iterator.hasNext()) {
                if(iterator.next().getName().equals(cls.getName())){
                    iterator.remove();
                    break;
                }
            }
        }
    }
    
    /** detach all observers */
    public void unRegisterAll() {
        synchronized(obserList) {
            obserList.clear();
        }
    }
    
    /** Ruturn the size of observers */
    public int countObservers() {
        synchronized(obserList) {
            return obserList.size();
        }
    }
    
    /**
     * notify all observer (通知所有观察者,在子类中实现)
     * @param objs
     */
    public abstract void notifyObservers(Object... objs);
    
    /**
     * notify one certain observer (通知某一个确定的观察者)
     * @param cls
     * @param objs
     */
    public abstract void notifyObserver(Class<?> cls, Object... objs);
    
    /**
     * notify one certain observer
     * @param cls
     * @param objs
     */
    public abstract <T> void notifyObserver(T t, Object... objs);
}
//目标被观察者
public class ConcreteObservable extends Observable {

    private static ConcreteObservable instance = null;
    private ConcreteObservable() {}
    public static synchronized ConcreteObservable getInstance() {
        if (instance == null) {
            instance = new ConcreteObservable();
        }
        return instance;
    }
    
    @Override
    public <T> void notifyObserver(T t, Object... objs) {
        // TODO Auto-generated method stub         if (t == null) throw new NullPointerException();
        this.notifyObserver(t.getClass(), objs);
    }

    @Override
    public void notifyObservers(Object... objs) {
        // TODO Auto-generated method stub         for (Class<?> cls : obserList) {
            this.notifyObserver(cls, objs);
        }
    }


    @Override  //通过java反射机制实现调用     public void notifyObserver(Class<?> cls, Object... objs) {
        // TODO Auto-generated method stub         if (cls == null) throw new NullPointerException();
        Method[] methods = cls.getDeclaredMethods();
        for (Method method : methods) {
            if (method.getName().equals("update")) {
                try {
                    method.invoke(cls, objs);
                                        break;
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block                     e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block                     e.printStackTrace();
                } catch (InvocationTargetException e) {
                    // TODO Auto-generated catch block                     e.printStackTrace();
                }
            }
        }
    }
    
}
//使用 (实现Observer接口)
public class Text extends Activity implements Observer {
   public void onCreate(...) {
       ConcreteObservable.getInstance().registerObserver(Text.class);
       ....
   }

   //实现接口chǔ理    public void update(Object... objs) {
       // 做操作,比如更新数据,更新UI等    }
}



 此文从网络中自动搜索生成,不代表本网站赞成被搜索网站的内容或立场    查看原文
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2018年7日历
2018-7-22 11:10:27
 
  网站联系 软件世界网-www.sjsjw.com ©2014 蜀ICP备06016416号 三峰网旗下网站