Java的观察者模式—— 一个通俗认识


         近来,Android的学习中,常常提及观察者模式这个东东。这个到底是哪个洞天呢?下面是我的一个认识。

          

        1.一些存在;

         在我的Java和Android中是不是常常有如下代码:

         Java==》JFrme

       		button.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				System.out.println("你点击了我");
			}
		});

 在JFrame中的button的点击事件。点击就触发事件,实现:System.out.println("你点击了我");    

      Java==》Android 

        myButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				System.out.println("你点击了我");
			}
		});
在Android中的button的实现点击了事件。点击触发,同上的结果;

   

     2.一些事件的业务 ;

     一个事件A因为事件B的变化而变化。就是A因为B而变化(敌动我动,敌不动我不动),其实,在我的所有的事件中都是这样的:因——果。



     3.初步总结:

           3.1 有一个数据源:Source

           3.2.有因数据源变化的观察者(一个多个):Observer

    

         问题:因——果就是数据源和观察者,那么他们之间的链接是什么呢?

         

         答:这个我们一时间不知道,但是你看看我们以前的列子吧

       		button.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				System.out.println("你点击了我");
			}
		});   

          他们是通过。addActionListener();的函数链接的,链接中的函数式一个接口函数。

    4.观察者模式:

    


       如图:两种形式,虽然不是官方(标准),只能像个样了。详细代码:


package com.owant.observer;

public class Client {
	/**
	 * 观察者模式: 1.特点:当某个对象变化时,别的对象跟着变化 2.可以有多个观察者 3.实现数据的共享和有业务和对象的分离
	 * 
	 * 实现方法: 1.创建一个被观察的主题Subject。他的父类为一个抽象的观察主题 他至少提供三个接口: addObserver 添加观察者
	 * removeObserver 移除观察者 notifyAllObserver 提醒观察者
	 * 
	 * 2.创建一个观察者。他的父类一般提供一个接口: upDate 更新数据
	 * 
	 * 3.主题添加观察者
	 * 
	 * 4.主题提醒观察者
	 * 
	 */
	public static void main(String[] args) {
		// 创建一个被观察的主题
		MyThemEvent event = new MyThemEvent();
		// 创建一个观察者
		MyObserver observer = new MyObserver("1");
		
		MyObserver observer2=new MyObserver("2");
		// 提醒观众者
		event.notifyAllObserver();
		// 添加观察者
		event.addObserver(observer);
		event.addObserver(observer2);

		event.notifyAllObserver();
	}

}
package com.owant.observer;

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

public class MyThemEvent implements ThemeEvent {
	// 一个数据
	private String str = "I am source";
	// 记录观察者
	private List<ObserverFather> list = new ArrayList();

	public void addObserver(ObserverFather observer) {
		if (observer != null) {
			list.add(observer);
		}
	}

	public void removeObserver(ObserverFather observer) {
		if (list.size() != 0) {
			list.remove(observer);
		}
	}

	public void notifyAllObserver() {
		for (ObserverFather of : list) {
			of.upDate(str);
		}
	}

}

package com.owant.observer;

public class MyObserver implements ObserverFather {
	private String Id;
	
	public MyObserver(String str){
		this.Id=str;
	}

	public void upDate(String str) {
		System.out.println("我是观察者"+Id+"  被观察的事件源发来数据为:" + str);
	}

}


package com.owant.observer;

public interface ThemeEvent {
	// 添加观察者
	public void addObserver(ObserverFather observer);

	// 移除观察者
	public void removeObserver(ObserverFather observer);

	// 提醒观察者
	public void notifyAllObserver();
}

package com.owant.observer;

public interface ObserverFather {
	// 跟新数据
	public void upDate(String str);

}


结果:


我是观察者1  被观察的事件源发来数据为:I am source
我是观察者2  被观察的事件源发来数据为:I am source



另一种:


package com.owant.observer.simplemodel;

public class LikeButton {

	private String str;
	private Listener listener;

	// 提供一个数据接口
	public interface Listener {
		public void upDate(String str);
	}

	// 数据变化
	public void ButtonEvent(String str) {
		this.str = str;
		if (listener != null) {
			listener.upDate(str);
		}
	}

	// 添加数据变化的监听
	public void addListener(Listener listener) {
        this.listener=listener;
	}

}<strong>
</strong>


package com.owant.observer.simplemodel;

import com.owant.observer.simplemodel.LikeButton.Listener;

public class Client {

	/**
	 * 这个观察者的模式是: 当数据改变时提供一个函数接口来获得 ,并且观察者在class内部
	 */
	public static void main(String[] args) {
		LikeButton lButton = new LikeButton();
		lButton.ButtonEvent("我点一次点击!");
		// 添加监听
		// lButton.addListener(new Listener() {
		//
		// public void upDate(String str) {
		//
		// System.out.println(str);
		// }
		// });

		lButton.addListener(new MyListener());
		lButton.ButtonEvent("我第二次被点击了");
	}

	static class MyListener implements Listener {

		public void upDate(String str) {
			System.out.println("我抓到的数据是:" + str);
		}

	}

}


这就是传说中的观察者模式。



推荐软件:思维导图






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值