回调函数升级版-设计模式(观察者模式)

书接上回,上一周大体写了一下回调函数的使用,这周我就大体说一下设计模式中的观察者模式。我自己认为观察模式就是回调函数的升级版,在用法上。废话少说,直接上图。

这是我正在弄的一个应用,画面有点模仿荔枝电台了,在这里感谢荔枝电台提供这么简洁的UI。本来这个项目的第一版使用的模式是回调加广播的形式。但是在重构代码的时候,我想了想何不使用观察者模式呢,这样能减少很多不必要的麻烦。

简单地说,观察者模式定义了一个一对多的依赖关系(也可以一对一),让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。通过这个解释,大家是不是认为上面的这个项目使用观察者模式是可不错的选择呢。哈哈,继续闲扯。

我不想画那种UML图(因为我水平有限,画不好,哈哈哈),我怕画多了自己迷糊了,也把你们弄迷糊了,如果需要看到的话,可以留言,到时我在认真的给补上。

观察者模式有观察者和被观察的对象。上面的那个项目,各个Activity是观察者,播放的类是被观察者,所以观察者不知道有多少个观察者,只做好自己的工作就可以,根据需求进行变化。

第一步:被观察者和观察者的两个类:

这里是被观察者的抽象类;

<pre name="code" class="html">package com.lbc.observer;

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

public abstract class Subject {

	private List<Observer> observers = new ArrayList<Observer>();

	//这个代替我们要观察的状态
	public String str;

	public void addObserver(Observer observer) {

		if (!observers.contains(observer)) {
			observers.add(observer);
		}
	}

	public void removeObserver(Observer observer) {

		if (observers.contains(observer)) {
			observers.remove(observer);
		}
	}

	/**
	 * 把一个类的对象给观察者
	 * 
	 * 这里可以修改成和上篇回调函数一样的样式,推送变量给观察者
	 * http://blog.csdn.net/liujianshui/article/details/46709229
	 */
	public void nodifyObservers() {
		for (Observer observer : observers) {
			observer.update(Subject.this);
		}
	}

	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		this.str = str;
	}
}

 

这里是观察者的接口类:

package com.lbc.observer;

public interface Observer {

	//这里你可以定义好几个方法
	public void update(Subject s);
}

2.现在要完成的是继承了Subject这个抽象类的子类,和实现了Observer这个接口的子类:

这是继承了Subject这个抽象类的子类

package com.lbc.observer;

public class MySubject extends Subject {

	
	public void changMethod() {
		// 设置我们的状态
		setStr("大家好,我是被观察者的子类哦");
		// 唤醒观察者
		nodifyObservers();
	}

}


我为了简单,把实现了Observer这个接口的子类用匿名内部类的形式写出来。
package com.lbc.observer;

public class Test {

	public static void main(String[] args) {
		MySubject mySubject = new MySubject();

		mySubject.addObserver(new Observer() {

			@Override
			public void update(Subject s) {
				System.out.println("第一个观察者" + s.getStr());
			}
		});
		mySubject.addObserver(new Observer() {

			@Override
			public void update(Subject s) {
				System.out.println("第二个观察者"+s.getStr());
			}
		});
		mySubject.addObserver(new Observer() {

			@Override
			public void update(Subject s) {
				System.out.println("第三个观察者"+s.getStr());
			}
		});
		mySubject.changMethod();
	}
}

这样简单的观察者模式就算结束了,但是真正在工作了,没有这么简单,还需要大家学会变通。如果上面看不懂的话,就留言,我把代码发给你。希望大家多多批评指正,让我能有进步。生命不止,学习不休。加油。由于上面的项目代码有保密条例,不方便发,但是大家有这方面问题,我们可以讨论哦。

下周的博客打算写代理模式,但是我不知道能不能找到一个好的例子表达这个代理模式,找到就写,找不到就改题材,哈哈。希望顺利。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基本概念 if you call me, i will call back 什么是回调函数 回调函数(callback Function),顾名思义,用于回调的函数。 回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数。回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机。回调函数包含下面几个特性: >属于工作流的一个部分; >必须按照工作流指定的调用约定来申明(定义); >他的调用时机由工作流决定,回调函数的实现者不能直接调用回调函数来实现工作流的功能; 回调机制 回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。 java回调机制: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。 >同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用; >回 调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口; >异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。 回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值