设计模式01观察者模式(java)
先发代码,有空来写内容。
observer1
- import java.util.Observer;
- import java.util.Observable;
- //学生类(Student)继承Observable后变得可以被观察
- class Student extends Observable{
- //属性
- private String name;
- private boolean isSleep = false;
- private boolean isLate = false;
- //构造函数
- public Student(){}
- public Student(String name){
- this.name = name;
- }
- //睡觉行为
- public void sleep(){
- System.out.println(name + " is sleeping");
- isSleep = true;
- setChanged();
- notifyObservers();
- }
- public String toString(){
- return name;
- }
- }
- //教师类(Teacher)实现Observer接口成为观察者
- class Teacher implements Observer{
- @Override
- public void update(Observable o,Object arg){
- System.out.println("teacher: "+o+",wakeup!wakeup!");
- }
- }
- //班主任类(ClassHead)实现Observer接口成为观察者
- class ClassHead implements Observer{
- @Override
- public void update(Observable o,Object arg){
- System.out.println("classHead: "+o+",cleanTheRoomAfterSchool");
- }
- }
- public class ObserverDemo{
- public static void main(String[] arguments){
- Student tom = new Student("Tom");
- tom.addObserver(new ClassHead());
- tom.addObserver(new Teacher());
- System.out.println("有 "+tom.countObservers()+" 个观察者在观察Tom");
- tom.sleep();
- }
- }
observer2
- import java.util.Map;
- import java.util.HashMap;
- import java.util.Observer;
- import java.util.Observable;
- //学生类(Student)继承Observable后变得可以被观察
- class Student extends Observable{
- //属性
- private String name;
- private boolean isSleep = false;
- private boolean isLate = false;
- //构造函数
- public Student(){}
- public Student(String name){
- this.name = name;
- }
- //睡觉行为
- public void sleep(){
- System.out.println(name + " is sleeping");
- isSleep = true;
- setChanged();
- notifyObservers("sleep");
- }
- //迟到行为
- public void late(){
- System.out.println(name + " was lated");
- isLate = true;
- setChanged();
- notifyObservers("late");
- }
- public String toString(){
- return name;
- }
- }
- //教师类(Teacher)实现Observer接口成为观察者
- class Teacher implements Observer{
- //参数arg作为key,该参数触发的回应作为value存储在Map中
- private Map<String,String> info = new HashMap<String,String>();
- public Teacher(){
- info.put("sleep",",wakeup!wakeup!");
- info.put("late",",come in.");
- }
- //添加键值对
- public boolean addSay(String k,String v){
- return info.put(k,v)==null?false:true;
- }
- @Override
- public void update(Observable o,Object arg){
- String say = info.get(arg);
- if(say == null){
- return;
- }
- System.out.println("teacher: "+o+say);
- }
- }
- //班主任类(ClassHead)实现Observer接口成为观察者
- class ClassHead implements Observer{
- private Map<String,String> info = new HashMap<String,String>();
- public ClassHead(){
- info.put("sleep",",goOutWashBaFace");
- info.put("late",",cleanTheRoom!");
- }
- public boolean addSay(String k,String v){
- return info.put(k,v)==null?false:true;
- }
- @Override
- public void update(Observable o,Object arg){
- String say = info.get(arg);
- if(say == null){
- return;
- }
- System.out.println("classHead: "+o+say);
- }
- }
- public class ObserverDemo{
- public static void main(String[] arguments){
- Student tom = new Student("Tom");
- tom.addObserver(new ClassHead());
- tom.addObserver(new Teacher());
- System.out.println("有 "+tom.countObservers()+" 个观察者在观察Tom");
- tom.sleep();
- tom.late();
- }
- }
Observer与Obvsevable实现
- import java.util.List;
- import java.util.ArrayList;
- import java.util.Iterator;
- //定义observer接口
- interface observer{
- public void update(observable o,Object arg);
- }
- //定义observable类
- class observable{
- //isChanged记录实例是否改变
- private boolean isChanged;
- //obsers存储观察者集合
- private List<observer> obsers;
- //构造函数初始化实例
- public observable(){
- isChanged = false;
- obsers = new ArrayList<observer>();
- }
- //设置是否发生变化为false
- protected void clearChanged(){
- isChanged = false;
- }
- //设置是否发生变化为true
- public void setChanged(){
- isChanged = true;
- }
- //返回对象是否发生改变
- public boolean hasChanged(){
- return isChanged;
- }
- //添加观察者
- public void addObserver(observer o){
- obsers.add(o);
- }
- //删除指定观察者
- public void deleteObserver(observer o){
- obsers.remove(o);
- }
- //清空所有观察者
- public void deleteObservers(){
- obsers.clear();
- }
- //返回观察者数量
- public int countObservers(){
- return obsers.size();
- }
- //如果对象发生改变就通知所有观察者,然后将变化状态设置为false
- public void notifyObservers(){
- notifyObservers(new Object());
- }
- public void notifyObservers(Object arg){
- if(!hasChanged())
- return;
- Iterator it = obsers.iterator();
- while(it.hasNext()){
- ((observer)(it.next())).update(this,arg);
- }
- clearChanged();
- }
- }
设计模式01观察者模式(java)的更多相关文章
- 折腾Java设计模式之观察者模式
观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...
- 设计模式之第18章-观察者模式(Java实现)
设计模式之第18章-观察者模式(Java实现) 话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队.英文的名字比较有意思,是paparazzo,这一说法据说 ...
- 23种设计模式全解析 (java版本)
转自:http://blog.csdn.net/longyulu/article/details/9159589 其中PHP常用的五种设计模式分别为:工厂模式,单例模式,观察者模式,策略模式,命令模式 ...
- java_设计模式_观察者模式_Observer Pattern(2016-07-27)
看了好几篇文章,最终还是觉得<Head First 设计模式>举得例子比较符合观察者模式. 观察者模式概述: 观察者模式有时被称作发布/订阅模式,它定义了一种一对多的依赖关系,让多个观察者 ...
- 设计模式之观察者模式(Observable与Observer)
设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...
- iOS设计模式(01):观察者
iOS设计模式(01):观察者 iOS-Observer-Pattern 什么是观察者模式 什么是观察者模式?你曾经订阅过报纸吗?在订阅报纸的时候,你不用去任何地方,只需要将你的个人地址信息以及订阅信 ...
- Head First 设计模式之观察者模式(Observer Pattern)
前言: 这一节开始学习观察者模式,开始讲之前会先像第一节那样通过一个应用场景来引入该模式.具体场景为:气象站提供了一个WeatherData对象,该对象可以追踪获取天气的温度.气压.湿度信息,Weat ...
- 从设计模式说起JAVA I/O流
从设计模式说起JAVA I/O流 之前写过一篇I/O流的入门介绍,直到最近看了设计模式,顺带理下I/O流的设计思路. JAVA类库中的I/O类分成输入和输出两部分,通过继承,任何自InputStrea ...
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
随机推荐
- 树莓派3B的食用方法-1(装系统 网线ssh连接)
首先要有一个树莓派3B , 在某宝买就行, 这东西基本上找到假货都难,另外国产和英国也没什么差别,差不多哪个便宜买哪个就行. 不要买店家的套餐,一个是配的东西有些不需要,有的质量也不好. 提示:除了G ...
- 腾讯云下安装 nodejs + 实现 Nginx 反向代理
本文将介绍如何给腾讯云上的 Ubuntu Server 12.04 LTS 64位主机安装 node 及 nginx,并简单配置反向代理. 笔者在整个安装过程中遇到不少麻烦(不赘述),如果你希望少踩坑 ...
- JavaScript单线程和浏览器事件循环简述
JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...
- 迟来的Json反序列化
源码发布 搞了一个下午,终于搞定了这个号称中国的github...以后源码直接在这里发布了(github实在用不来,英文实在太烂了) https://code.csdn.net/jy02305022/ ...
- Windows 2008 R2 安装sp1时未知错误的解决办法
最近在为Windows Server 2008 R2 打sp1补丁时出现“发生未知错误”,详细信息错误:0x800f0818: google后找到解决问题步骤,参照:http://www.wikiho ...
- Go语言实战 - revel框架教程之CSRF(跨站请求伪造)保护
CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山坡网之前属于第一种情况,哈哈,所以至今没什么问题. ...
- Java程序员的日常—— Arrays工具类的使用
这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排 ...
- 偶遇this之坑
前言 在写一个懒加载插件时,遇到一个坑,就是this的指向问题,我想这种情况大部分人都会遇到,就写下来,新手也有个参考. 事件 有些页面图片比较多,但用户还不一定会全看,这样的话,全部去加载这些图片, ...
- Python标准模块--import
1 模块简介 作为一个Python初学者,你首先要学会的知识就是如何引入其它模块或者包.但是,我发现有些开发者虽然使用Python很多年,依然不了解Python引入机制的灵活性.这篇文章,我们就会研究 ...
- java自定义注解类
一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...