package Observer;

public class Test {

	/**
* client测试类别
* 观察者模式一般由四部分组成:
* 1摘要观察员(教科书被称为一般“Subject(抽象类的主题)”),
* 里面一般定义了抽象的add(),remove(),notifyAll()等方法,
* 分别用于添加观察者,删除观察者,通知观察者自己的变化。
* 2详细的被观察者类(一般教材上都叫做“ConcreteSubject(详细的主题类)”),
* 是抽象的被观察者(Subject)的详细的实现类,里面实现了add(),remove(),notifyAll()等方法;
* 3抽象的观察者类(一般教材上叫做“Observer”),里面一般定义了一个抽象的update()方法。
* 4详细的观察者类(一般教材上叫做“ConcreteObserver”),他是抽象的观察者类(Observer)的详细实现,它实现了update()方法,
* 用于接受被观察者的详细变化;
*
* 这里有个样例:有两个被观察者陈美嘉和胡一菲,他们分别有不同的观察者。陈美嘉的观察者有吕小布,
* 胡一菲的观察者有曾贤儿和张伟两个,当陈美嘉和胡一菲有什么变化时,立即就会分别被他们的观察者说知道;
* @author wl
*/
public static void main(String[] args) {
Watched HuYiFei=new ConcerteWatched();
Watched ChenMeiJia=new ConcerteWatched(); Watcher LvXiaoBu=new ConcreteWatcher("吕小布","陈美嘉");
Watcher ZengXianEr=new ConcreteWatcher("曾贤儿","胡一菲");
Watcher ZhangWei=new ConcreteWatcher("张伟","女神"); ChenMeiJia.addWatcher(LvXiaoBu);
HuYiFei.addWatcher(ZengXianEr);
HuYiFei.addWatcher(ZhangWei); HuYiFei.notifyWatchers("好想看电影啊! 。! "); ChenMeiJia.notifyWatchers("好想去旅游啊!!!"); } }

package Observer;
/**
* 抽象的观察者接口类
* @author wl
*
*/
public interface Watcher {
void updata(String str);
}
package Observer;
/**
* 抽象的被观察者接口
* @author wl
*
*/
public interface Watched {
void addWatcher(Watcher watcher);
void removeWatcher(Watcher watcher);
void notifyWatchers(String str);
}
package Observer;
/**
* 详细的观察者类,比方样例中的吕小布。曾贤儿,张伟就是观察者的实例
* @author wl
*
*/
public class ConcreteWatcher implements Watcher {
String watcheredName;
String name; public ConcreteWatcher(String name,String watcheredName){
this.name=name;
this.watcheredName=watcheredName;
}
@Override
public void updata(String str) {
System.out.println(name+"心里暗暗高兴“嘿嘿!!。机会来了,我的"+watcheredName+"说她 ‘"+str+"’”");
} }
package Observer;

import java.util.ArrayList;
import java.util.List;
/**
* 详细的被观察者类,比方样例中的胡一菲,陈美嘉就是详细的被观察者的实例
* @author wl
*
*/
public class ConcerteWatched implements Watched {
List<Watcher> list=new ArrayList<Watcher>(); @Override
public void addWatcher(Watcher watcher) {
list.add(watcher);
} @Override
public void removeWatcher(Watcher watcher) {
list.remove(watcher);
} @Override
public void notifyWatchers(String str) {
for(Watcher watcher:list){
watcher.updata(str);
}
} }

输出为:

曾贤儿心里暗暗高兴“嘿嘿!!

机会来了,我的胡一菲说她 ‘好想看电影啊!

!!’”

张伟心里暗暗高兴“嘿嘿!

!!

机会来了,我的女神说她 ‘好想看电影啊!!。’”

吕小布心里暗暗高兴“嘿嘿!

。一个偶然的机会,我的陈女士说,她 ‘好想去旅游啊!!!’”

版权声明:本文博客原创文章,博客,未经同意,不得转载。

java设计模式:观察者模式的更多相关文章

  1. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  2. 【设计模式】Java设计模式 - 观察者模式

    [设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...

  3. JAVA 设计模式 观察者模式

    用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...

  4. Java设计模式--观察者模式到监听器

    观察者模式是对象的行为模式.又叫做发布-订阅模式.模型-视图模式.源-监听器模式. 抽象主题角色:主题角色将所有对观察者对象的引用到保存在一个集合里,每个主题都可以拥有任意数量的观察者.抽象主题提供一 ...

  5. Java设计模式の观察者模式(推拉模型)

    目录: 一.观察者定义 二.观察者模式的结构(推模式实现) 三.推模型和拉模型(拉模式实现) 四.JAVA提供的对观察者模式的支持 五.使用JAVA对观察者模式的支持(自带推模式实现实例) 一.观察者 ...

  6. Java设计模式 - 观察者模式

    定义 观察者模式属于对象行为型模式. 在对象之间定义一对多的依赖,这样一来当一个对象改变状态,依赖它的对象都会收到通知并自动更新. 优点 1.  主题和观察者之间抽象耦合.无论什么对象主要实现了特定的 ...

  7. 我的Java设计模式-观察者模式

    相信大家都有看过<喜洋洋与灰太狼>,说的是灰太狼和羊族的"斗争",而每次的结果都是灰太狼一飞冲天,伴随着一句"我还会回来的......".为灰太狼感 ...

  8. java设计模式-观察者模式学习

    最近学习了设计模式中的观察者模式,在这里记录下学习成果. 观察者模式,个人理解:就是一个一对多模型,一个主体做了事情,其余多个主体都可以观察到.只不过这个主体可以决定谁去观察他,以及做什么事情可以给别 ...

  9. Java设计模式——观察者模式(事件监听)

    最近在看Tomcat和Spring的源码,在启动的时候注册了各种Listener,事件触发的时候就执行,这里就用到了设计模式中的观察者模式. 引-GUI中的事件监听 想想以前在学Java的GUI编程的 ...

  10. JAVA设计模式—观察者模式和Reactor反应堆模式

    被观察者(主题)接口 定义主题对象接口 /**抽象主题角色: 这个主题对象在状态上发生变化时,会通知所有观察者对象 也叫事件对象 */ public interface Subject { //增加一 ...

随机推荐

  1. ecshop网站建设手机版wap版出现lib.debug.php on line 303

    首先我们可以看到页面中提示\includes\lib.debug.php on line 303这样的错误,那么我们首先应该找到这个文件的低303行.代码是: $pa = &new Print ...

  2. sublime text 2安装及使用

    1.首先下载Sublime Text:http://www.sublimetext.com/ 2.基本设置.參考此文:http://blog.jobbole.com/40660/ { "au ...

  3. 转载:PHP时间戳 strtotime()使用方法和技巧

    在php中我想要获取时间戳有多种方法,最常用的就是使用time函数与strtotime()函数把日期转换成时间戳了 获取指定的年月日转化为时间戳:pHP时间戳函数获取指定日期的unix时间戳 strt ...

  4. Android实现限制EditText输入文字的数量

    一: 声明控件.          TextView hasnumTV;         TextView hasnum;// 用来显示剩余字数         int num = 50;// 限制的 ...

  5. android studio下gradle与Git错误解决方法

    Error: Gradle: Execution failed for task ':mytask' > A problem occurred starting process 'command ...

  6. gc overhead limit exceeded eclipse错误解决方式

    在Eclipse打包的时候报错:gc overhead limit exceeded eclipse 原因是Eclipse默认配置内存太小须要更改安装Eclipse目录下的eclipse.ini文件. ...

  7. JS多语种方式

    方案: 在不同的移动平台(IOS.Android)上,并建立了HTML页面通信框架.主要业务逻辑HTML发展:我要支持多语言开发. 动机: 通过积极主动的信息方式,前一页完成初始化,获取当前语言选项. ...

  8. Spark 1.0.0 横空出世 Spark on Yarn 部署(Hadoop 2.4)

    就在昨天,北京时间5月30日20点多.Spark 1.0.0最终公布了:Spark 1.0.0 released 依据官网描写叙述,Spark 1.0.0支持SQL编写:Spark SQL Progr ...

  9. win10无法新建文件夹怎么办 win10右键新建菜单设置方法

    有朋友安装了win10系统后发现右键菜单中没有新建项,而平时使用新建 - 文件夹项的机率很高.如何才能恢复桌面右键菜单中的新建项呢? 右键点击桌面空白处,在右键菜单中发现没有新建项: 桌面右键菜单没有 ...

  10. 重新想象 Windows 8 Store Apps (6) - 控件之媒体控件: Image, MediaElement

    原文:重新想象 Windows 8 Store Apps (6) - 控件之媒体控件: Image, MediaElement [源码下载] 重新想象 Windows 8 Store Apps (6) ...