【设计模式】观察者模式
来源:互联网 发布:四川地道川货网络大赛 编辑:程序博客网 时间:2024/06/04 20:00
- 前提导论
- 故事
- 观察者模式
- 建立模式
- 实现代码
- 故事结局
前提导论
为了学习设计模式时便于理解,我将用基于农夫和他的村子与森林为背景环境,讲一个故事时,阐述一个设计模式,今天作为第一个,我希望讲一个实用而充实的设计模式–观察者模式。
故事
这是一个美丽而又安静祥和的村庄,村里的人日出而作日落而息,村子里,农夫靠伐木和打猎为生,女人呢,额。。。。总之,大家过着幸福美满的生活。
有一天,农夫张三,张四,一起出去伐木时,看到了一棵品种稀贵的树,嗯,松树,可以卖个好价钱,但是这棵树还很小。他们也就暂时没多想了,只是希望有一天这棵松树长大了,就砍伐卖个好价钱咯。这棵树,很神奇,不像别的树长的慢,它一天就能长高一分米,照这个速度用不了几个月就能长成参天大树了。张三张四无意之间也发现了这个神奇之处,于是他俩愈加的希望能在树长成大树可以卖个好价钱时及时来砍伐了。故事到这里结束了吗?没有,突然有一天,他们俩做了一个梦,梦里那棵松树,竟然开口说话了,它说:我知道你很想得到我,这样吧,我每天都来你的梦中告诉你我生长的状态吧!~~~~
好啦,故事就是这样,那如何转换成我们今天要说的观察者模式呢,首先我们来了解什么是观察者模式吧。
观察者模式
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
建立模式
在上面我们的故事中,
张三、张四——>观察者
神树(松树)—>主题对象
事件————>得到松树的生长状态
下面图是根据故事采用观察者模式建立的模型
实现代码
观察者方面的代码:
//定义一个Farmer接口public interface Farmer { public void setName(String name);//设置名字 public String getName();//获取名字 public void getStatus(String status);//获取状态 public void register(Tree tree);//注册为观察者 public void remove(Tree tree);//取消关注}//定义一个姓张的家族public class Zhang implements Farmer{ private String name; public Zhang(String name){ this.name = name; } @Override public void getStatus(String status) { System.out.println(status); } @Override public String getName() { return name; } public void setName(String name){ this.name = name; } @Override public void register(Tree tree) { tree.registerFarmer(this); } @Override public void remove(Tree tree) { tree.removeFarmer(this); }}
主题对象方面的代码:
//定义树接口public interface Tree { public void registerFarmer(Farmer farmer);//注册观察者 public void removeFarmer(Farmer farmer);//删除观察者 public void notifyFarmer(String status);//通知所有观察者 public void update(String status);//更新状态}//这就是那棵神树,松树public class PineTree implements Tree{ ArrayList<Farmer> lists = new ArrayList<>();//观察者列表 @Override public void registerFarmer(Farmer farmer) { lists.add(farmer); } @Override public void removeFarmer(Farmer farmer) { lists.remove(farmer); } @Override public void notifyFarmer(String status) { for(Farmer f:lists){ f.getStatus(f.getName()+","+status); } } @Override public void update(String status) { this.notifyFarmer(status); }}
转换成代码讲故事
public class Main { public static void main(String[] args) { //村子里有两个农夫,张三和张四 Zhang zhangsan = new Zhang("张三"); Zhang zhangsi = new Zhang("张四"); //无意之间发现一颗神树,其实就是一棵松树 PineTree pine = new PineTree(); //他们的发现,使得他们成为了这棵树的观察者,因为一直关注着这棵树的成长,等有一天能砍了卖钱 zhangsan.register(pine); zhangsi.register(pine); //神树长大了,托梦告诉了观察它的所有人 pine.update("我是松树,我长大了,可以成为有用木材了,来砍我吧"); }}运行结果张三,我是松树,我长大了,可以成为有用木材了,来砍我吧张四,我是松树,我长大了,可以成为有用木材了,来砍我吧
故事结局
张三张四把神树砍了卖了好价钱,从此他们两家过上了小康生活。。。。
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- 设计模式-观察者模式
- 设计模式-【观察者模式】
- 设计模式-观察者模式
- 设计模式 -- 观察者模式
- 设计模式-观察者模式
- 【设计模式】观察者模式
- 设计模式- 观察者模式
- 设计模式- 观察者模式
- 设计模式--观察者模式
- c语言==数组和指针间的联系与区别(10)
- Ajax Zero to Hero (2)入门代码的简单封装
- 主流NoSQL技术详解与比较
- java中的extends 和implements
- Android 之 SQLite数据库 查询数据库
- 【设计模式】观察者模式
- maven入门之helloworld
- 大神的ACM训练计划(详细)
- csharp读取Xml文档
- split分割字符串
- bash脚本中出现[[:not found错误的解决方法
- ThreadPoolExecutor(二)——execute
- java接口继承多个接口
- java时间格式的转化问题