码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式学习二之观察者模式1

时间:2015-11-12 01:19:39      阅读:308      评论:0      收藏:0      [点我收藏+]

标签:

  观察者模式可谓是我们用的最多的模式之一了,如果开发过界面程序的话,各种监听事件,setOnClickListener(),设置点击的监听事件,这里就是一个观察者模式的应用了。观察者模式是什么呢?是一个一对多得依赖,一个主题,多个订阅者,就像报纸在报社和读者间的关系一样,读者通过给报社交钱告诉报社我需要你得报纸,报社分发报纸的时候,对所有交钱了得读者一一派发报纸。

  怎么实现呢?考虑接口的应用,以及List容器的使用等。

  

主题接口,相当于报社
package com.csshu;

 主题接口,具有注册观察者和移除观察者方法
public interface mysubject {
    public void registerObserver(myobserver o);
    public void removeObserver(myobserver o);
    
}
这里需要提供注册(交钱)和取消(相当于读者不想继续订阅报纸了)这两个方法,没错
这些方法需要在主题(报社)里面实现,而观察者(读者)需要去调用,下面有分享。

观察者接口
package com.csshu;

public interface myobserver {
    public void update(int a,int b,int c);
}


这里是观察者1的实现,
package com.csshu;

public class Observer implements myobserver {

    @Override
    public void update(int a, int b, int c) {
        System.out.println(a+"---one,"+b+"---"+c);
    }
    
}

第二个观察者,
package com.csshu;

public class Observer2 implements myobserver {

    @Override
    public void update(int a, int b, int c) {
        System.out.println(a+"---two,"+b+"---"+c);
    }
    
}

主题对象的实现,
package com.csshu;

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

public class Subject implements mysubject{
    private List<myobserver> array = new ArrayList<>();
    @Override
    public void registerObserver(myobserver o) {
        array.add(o);
    }

    @Override
    public void removeObserver(myobserver o) {
        int index = array.indexOf(o);
        if (index > -1){
            array.remove(index);
        }
    }
    
    public void notifyDatasetchange(int a ,int b,int c){
        for (int i=0;i<array.size();i++){
            array.get(i).update(a, b, c);
        }
    }
    
}
可以看到,我们实现了两个方法,主要是通过List来实现的,通过notifyDatasetchange方法
来给每个注册的观察者更新在主题中可以传递的数值,这里我们传递a,b,c

最后是main方法,
package com.csshu;

public class mains {
    public static void main(String[] args) {
        Subject sub = new Subject();
        Observer o1 = new Observer();
        Observer2 o2 = new Observer2();
        sub.registerObserver(o1);
        sub.registerObserver(o2);
        sub.notifyDatasetchange(1, 2, 3);
    }
}
我们new了一个主题,两个观察者,这里是通过调用主题对象里面的方法注册观察者,当然
可以更含蓄的通过观察者的构造方法传递主题对象的引用,然后再调用其注册方法。
主题用notify来把需要传递的数据传递给观察者。

 

设计模式学习二之观察者模式1

标签:

原文地址:http://www.cnblogs.com/likeshu/p/4957727.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!