`
tgwiloveyou
  • 浏览: 9431 次
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

白话设计模式_观察者模式

阅读更多

        好久没搞java了,要找工作了,复习下设计模式~~

       观察者模式:描述的是一对多的关系,当”一”的状态发生变化时,会通知”多”的一端,前提是”多”个对象必须事先注册到”一”的对象上,让“一”知道它们的存在。
       举个形象的例子:我们平时订阅杂志,每个订阅者(即观察者)必须到杂志社注册个人信息,杂志社为了在日后能够顺利分发杂志,此时必须保存每个订阅者的信息,当杂志社出版新杂志,它就会通过之前那个记录列表一个一个的分别通知它的每一位订阅者,只要你在它那里注册过,就会一直收到新的杂志。当然,你可以选择取消订阅,这样杂志社就不会再向你送新杂志了。只有杂志社一直存在,就会不停的有人订阅杂志或取消订阅,而这个动作是在整个运行机制中动态发生的。


      为了松耦合,我们针对接口编程,这是一个主题的接口,声明三个方法,作用分别是注册订阅者、取消订阅、状态变化时通知所有订阅者

public interface Subject {
	public void registerSub(Subscriber sub);
	public void cancelSub(Subscriber sub);
	public void notifySubs();
}

 

        接下来是主题接口的实现类,ConcreteSubject.java

public class ConcreteSubject implements Subject {

	private List<Subscriber> subs = new ArrayList<Subscriber>();
	private String state1;
	private String state2;
	
	public void registerSub(Subscriber sub) {
		subs.add(sub);
	}

	public void cancelSub(Subscriber sub) {
		int index = subs.indexOf(sub);
		if (index >= 0) {
			subs.remove(sub);
		}
	}

	public void notifySubs() {
		for (Subscriber sub : subs) {
			sub.update(state1, state2);
		}
	}
	
	public void stateChanded(String state1, String state2){
		this.state1 = state1;
		this.state2 = state2;
		notifySubs();
	}
}

        分析这个类:首先,因为当有新消息时会通知所有的订阅者,显然ConcreteSubject的实例必须知道有哪些对象注册到它上面来了,所以ConcreteSubject类中必须有一个集合类型变量:List subs; 用来保存每一个订阅者的引用。由于订阅者可以不同的类型,想要将不同类的对象保存到同一个集合中,最简单的办法就是让不同的订阅者类现实一个共同的接口,我们称之为Subscriber(订阅者),这样前面的集合变量类型就可以通过泛型指明了,即List<Subscriber> subs; 其次,分别实现Subject接口声明的三个方法;最后,我们模拟两个变量state1, state2,当它们发生变化时,会调用notifySubs()更新所有它的注册者。


       通过上面的分析,我们需要一个Subscriber接口:

public interface Subscriber {
	public void update(String state1, String state2);
}

         假设有三个订阅者

         小明:

public class XiaoMing implements Subscriber {
	
	private Subject subject;
	private String state1;
	private String state2;

	public XiaoMing(Subject subject) {
		this.subject = subject;
		subject.registerSub(this);
	}
	
	public void update(String state1, String state2) {
		this.state1 = state1;
		this.state2 = state2;
		System.out.println("XiaoMing被通知了...");
	}
}

        后两个类与小明类大同小异

      大明:

public class DaMing implements Subscriber {

	private Subject subject;
	private String state1;
	private String state2;

	public DaMing(Subject subject) {
		this.subject = subject;
		subject.registerSub(this);
	}

	public void update(String state1, String state2) {
		this.state1 = state1;
		this.state2 = state2;
		System.out.println("DaMing被通知了...");
	}
}

       小红:

public class XiaoHong implements Subscriber {

	private Subject subject;
	private String state1;
	private String state2;

	public XiaoHong(Subject subject) {
		this.subject = subject;
		subject.registerSub(this);
	}
	
	public void update(String state1, String state2) {
		this.state1 = state1;
		this.state2 = state2;
		System.out.println("XiaoHong被通知了...");
	}

 

        这三个实际的订阅者 实现了一个共同的接口,类似于一个标识,告诉主题“我是一个订阅者”,当注册后,如果有新消息请通知我。我们看到,Subscriber接口中只声明了一个方法update(),这个接口的作用在于为“主题”通知”订阅者”提供一个统一的方法。


     测试:

public class Main {
	public static void main(String[] args) {
		//注册
		ConcreteSubject subject = new ConcreteSubject();
		XiaoMing xm = new XiaoMing(subject);
		DaMing dm = new DaMing(subject);
		XiaoHong xh = new XiaoHong(subject);
		//Subject状态发生变化
		subject.stateChanded("new1", "new2");
		
		System.out.println();
		
		subject.cancelSub(dm);
		subject.stateChanded("new3", "new4");
	}

}

       可以看到,订阅者注册到主题之后,主题的状态发生变化(对象中变量被重设)时,会依次通知每个订阅者,而当订阅者取消订阅后,主题的新消息再不再通知它。


     总结:

     观察者模式的关键在于:一个订阅接口,多个订阅者实现类,主题中以一个集合的形式保存所以订阅者,这样就可以向每个订阅者发送消息

     观察者模式的灵活性在于:如果有增加一个订阅者,完全不用修改ConcreteSubject类,直接让新添加的订阅者实现Subscriber接口,并在构造函数中向主题注册,完了就可以直接用了。

分享到:
评论
1 楼 yekui 2012-09-07  
总结的不错。很有借鉴性,谢谢。

相关推荐

    白话java23设计模式

    设计模式(Design pattern)是一套被反复使用、...本章系Java之美[从菜鸟到高手演变]系列之设计模式,我们会以理论与实践相结合的方式来进行本章的学习,希望广大程序爱好者,学好设计模式,做一个优秀的软件工程师!

    白话设计模式通俗易懂

    非常好的设计模式介绍资料,通俗易懂,适用于编程人员参考。采用了大量图片介绍系统的展示了编程当中常用的各种模式设计

    白话说电气_相电压和线电压的分析

    白话说电气_相电压和线电压的分析 白话说明 比较容易理解

    观察者模式 通俗易懂讲解

    文档加代码,如果看完pdf,观察者模式还没学会,感觉你没必要学设计模式了,文档非常通俗易通,适合新手上手。

    白话说电气_电机制动的几种常见方式.pdf

    白话说电气_电机制动的几种常见方式.pdf

    深入浅出设计模式中文版【13章、附录】

    深入浅出设计模式 pdf 深入浅出设计模式 中文版 设计模式 下载说明: 因个人上传资源大小只能是20M,而该书的PDF格式过大,所以只能分开上传。如有不便请谅解。【该书一共13章,在上传的时候我尽量按章节顺序打包...

    白话讲解创建型设计模式:单例原型构建

    写在前面 分享一些设计模式的笔记。陆续整理,按照设计模式类型,创建型,结构型,行为型发布 博文会用通俗的话梳理一些自己的理解,结合开发中的实际场景, 理解不足小伙伴帮忙指正,虚心接受 ^_^ 傍晚时分

    经典设计模式讲解以及项目实战(Java版)

    为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也有几个朋友给我点鼓励,给了star。本文工程...

    设计模式总结.docx

    1、设计模式的一些总结思考, 2、用白话总结了设计模式的精要, 3、帮助大家理解记忆一些常用的设计模式。

    《设计模式与游戏完美开发》java demo.zip

    java课程设计大作业,java、算法练手项目,适合初学java、数据结构的同学拿来学习研究,基于java、GUI开发的小游戏,程序都经过测试,可以直接运行,资源含程序运行所需的源码、资源文件等全部数据,有需要的可放心...

    策略模式 template模式

    设计模式中的策略模式,template模式详细讲解。

    白话中台战略-中台是个什么鬼.pdf

    白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-...

    java课程设计作业-模仿大富翁游戏,使用Java Swing (GUI) 实现的单机游戏,遵循MVC设计模式

    java课程设计作业——模仿大富翁游戏,使用Java Swing (GUI) 实现的单机游戏,遵循MVC设计模式 A Java Swing (GUI) game. 单机版的大富翁游戏,纯Java实现,采用MVC设计模式。 所有素材来自 大富翁客户端+冒险岛...

    深入浅出设计模式9~12章

    作者Eric Freeman 和Elisabeth Freeman,使用白话文的形式在讨论中介绍23中设计模式,有异与原《设计模式》更加通俗易懂。通过实际事例来讲解每一个设计模式,生动有趣,不会感觉到枯燥。

    深入浅出设计模式中文版13章

    作者Eric Freeman 和Elisabeth Freeman,使用白话文的形式在讨论中介绍23中设计模式,有异与原《设计模式》更加通俗易懂。通过实际事例来讲解每一个设计模式,生动有趣,不会感觉到枯燥。

    深入浅出设计模式

    这本书作者Eric Freeman 和Elisabeth Freeman使用白话文的方式,清楚的介绍了全部23种设计模式。简洁易懂。共13章节。此为封面、目录

    设计模式附录

    作者Eric Freeman 和Elisabeth Freeman,使用白话文的形式在讨论中介绍23中设计模式,有异与原《设计模式》更加通俗易懂。通过实际事例来讲解每一个设计模式,生动有趣,不会感觉到枯燥。

    白话c++.pdf

    白话c++.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!

    《白话C++》适合初学者

    这本书的特点在于语言生动,没有枯燥的感觉在聊天胡侃中学习C++,不会累!

    白话windows编程.rar

    白话windows编程.rar

Global site tag (gtag.js) - Google Analytics