设计模式之第18章-观察者模式(Java实现)

  话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队。英文的名字比较有意思,是paparazzo,这一说法据说来自意大利电影《滴露牡丹开》中一个专门偷拍明星照片的一个摄影师的名字,“Paparazzo”,中文译为帕帕拉齐,俗语就是狗仔队。这些明星因狗仔队而荣,获得曝光率,也因狗仔队而损,被曝光负面新闻,不管怎么说,总之是“火起来了”,让明星们又爱又恨。(众人:鱼哥,你扯远了)。咳咳,这个狗仔队其实嘛,也就是所谓进行监视观察活动,接下来就让观察者来给我们讲讲观察者与设计模式不得不说的那些个事儿。

观察者模式之自我介绍

  额就四(我就是)观察者,也被称作依赖或者发布订阅,是在项目中经常用到的一种模式。定义如下:Define a one-to-many dependency between objects so that when one objects changes state, all its dependents are notified and updated automatically.翻译过来就是说:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。观察者的通用类图如下:

  

观察者模式之自我分析

  首先来说下好处:

  • 支持广播通信。
  • 目标和观察者之间抽象耦合。

  接着是缺点部分:

  • 因为一个观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。
  • 然后又是效率问题了,开发效率以及运行效率方面都有可能存在问题,一个被观察者,多个观察者,开发调试比较复杂,而且一个观察者卡壳,其它观察者也会被影响。
  • 另外多级触发的效率也需要考虑到。

观察者模式之实现

  至于实现那么就以“贱人曽”来举个栗子吧。就拿曾小贤来举栗子(贤哥,我不是有意的,不要怪我撒,我知道你是LOLer,打得还不错),首先是被观察者Observable,就是名人,比如说曽大大,习大大,Linus大大等等:

 public interface Obeservable{
//增加观察者
public void addObserver(Observer observer);
//删除观察者
public void deleteObserver(Observer observer);
//发生改变通知观察者
public void notifyObservers(String context);
}

  这个是通用的观察者接口,所有的观察者都可以实现这个接口,接下来是小贤的接口:

 public interface IZengXiaoXian{
//吃饭
public void eat();
//睡觉
public void sleep();
//玩
public void play();
}

  小贤的接口包含3个活动,吃饭、睡觉、打豆豆,啊,口滑了,是玩耍,娱乐活动,比如说和子萱出去玩耍了之类的,下面是具体的小贤的实现类:

 public class ZengXiaoXian implements IZengXiaoXian,Obserable{
//定义动态数组存放不同媒体的狗仔队
private ArrayList<Observer> observerList = new ArrayList<>();
//增加观察者
public void addObserver(Observer observer){
this.observerList.add(observer);
}
//删除观察者
public void deleteObserver(Observer observer){
this.observerList.remove(observer);
}
//发生改变通知观察者
public void notifyObservers(String context){
for (Observer observer : observerList ) {
observer.update(context);
}
}
//吃饭
public void eat(){
System.out.println("曾小贤要吃饭了");
this.notifyObservers("曾小贤要吃饭了");
}
//睡觉
public void sleep(){
System.out.println("曾小贤要睡觉了");
this.notifyObservers("曾小贤要睡觉了");
}
//玩
public void play(){
System.out.println("曾小贤要玩耍了");
this.notifyObservers("曾小贤要玩耍了");
}
}

  被观察者已经实现了,然后是观察者的实现,首先依然是观察者的接口:

 public interface Observer{
//发现被观察的人有动静,就开始准备写稿子,整头条什么的
public void update(String context);
}

  然后就是狗仔队的实现了,狗仔队一号出动:

 public class Paparazzo1 implements Observer{
//狗仔队一号一旦发现有什么爆料,就告诉老板
public void update(String str){
System.out.println("观察到曾小贤和张子萱拥吻,开始汇报");
this.reportToXX(str);
}
//汇报给XX媒体
private void reportToXX(String context){
System.out.println("老大,我看到"+context);
}
}

  如果你还想要其它狗仔队请自行实现Paparazzo2、3等等等等,那么我们用一个场景类来实现当时的现场情况:

 public class Client{
public static void main(String[] args) {
//出来一个狗仔队
Observer paparazzo = new Paparazzo(); //曾小贤出场
ZengXiaoXian zengxiaoxian = new ZengXiaoXian();
zengxiaoxian.addObserver(paparazzo); //看看曾小贤在干嘛
zengxiaoxian.eat();
zengxiaoxian.play();
zengxiaoxian.sleep();
}
}

  好了,基本实现就是这样子了。

观察者模式之应用场景

  当你遇到以下任意一种情况,可以考虑使用额来实现:

  • 当一个抽象模型有两个方面,其中一个依赖于另一个方面。
  • 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
  • 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。

  这个时候就轮到我登场了,狗仔队就是额,额就四狗仔队,噢耶。“动二动二,我是动幺,这里有一名疑似精神病院跑出来的患者,赶紧给予抓捕带回”,“鱼哥,救额,额不是精神病,你快告诉他们。”(作者按:少一个了,这样以后就少一个人和我抢零食了。默默离开)。金坷垃刺秦王,设计模式任我闯。

  PS:本博客欢迎转发,但请注明博客地址及作者~

  博客地址:http://www.cnblogs.com/voidy/

  博客新址:http://voidy.net

  <。)#)))≦ 

设计模式之第18章-观察者模式(Java实现)的更多相关文章

  1. 设计模式之第15章-适配器模式(Java实现)

    设计模式之第15章-适配器模式(Java实现) “呔,来着何人,报上名来.”“这是谁啊,我怎么没见过”,“就是啊,我也没印象.”“我当然是适配器了,要不然还能是谁.”适配器模式碎碎念:我不就是昨天把你 ...

  2. 设计模式之第4章-装饰模式(Java实现)

    设计模式之第4章-装饰模式(Java实现) “怎么了,鱼哥?” “唉,别提了,网购了一件衣服,结果发现和商家描述的差太多了,有色差就算了,质量还不好,质量不好就算了,竟然大小也不行,说好的3个X,邮的 ...

  3. 设计模式之第0章-单例模式(Java实现)

    设计模式之第0章-单例模式(Java实现) 当当当当~首先有请最简单的单例模式登场,先来个自我介绍吧 单例模式之自我介绍 我,单例模式(Singleton Pattern)是一个比较简单的模式,我的定 ...

  4. 设计模式之第3章-模板方法模式(Java实现)

    设计模式之第3章-模板方法模式(Java实现) "那个,上次由于我老婆要给我做饭,所以就没有说完就走掉了...这个那个".这次和以前一样,先来开场福利(工厂方法模式已被作者踹下场) ...

  5. 设计模式之第2章-抽象工厂模式(Java实现)

    设计模式之第2章-抽象工厂模式(Java实现) “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说 ...

  6. 设计模式之第1章-工厂方法模式(Java实现)

    设计模式之第1章-工厂方法模式(Java实现) “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~ ...

  7. [head first 设计模式]第二章 观察者模式

    [head first 设计模式]第二章 观察者模式 假如我们有一个开发需求--建造一个气象观测站展示系统.需求方给我们提供了一个WeatherObject对象,能够自动获得最新的测量数据.而我们要建 ...

  8. Java 第18章 多态

    18 章  --> 多态 继承: extends 抽象类 abstract (限制类的实例化) 抽象方法 public abstract void show(); //抽象方法只有方法的声明,没 ...

  9. Head First 设计模式 第2章 观察者模式

    第2章.观察者模式 1.定义: 在对象之间定义一对多关系,当一个对象改变状态时,该对象的依赖会收到通知,并自动更新. 2.介绍 在介绍观察者模式之前,先来说一个日常生活中经常碰到的事(可能现在的人碰到 ...

随机推荐

  1. 菜鸟 学注册机编写之 “RSA”

    测试环境  系统: xp sp3 调试器 :od 1.10 RSA简单介绍 选取两个别人不知道的大素数p, q. 公共模n = p*q 欧拉值φ(n) = (p-1)(q-1) 选取公匙(加密匙) e ...

  2. Unity光晕剑效果的Shader简单实现

    最近遇到了一个需求,想要一种在刀剑上带有光晕的酷炫效果,甚至是还想要有闪烁呼吸效果,于是就写了一个简单的叫LightSwrod的Shader去实现,先上图看看效果吧. 简单展示 这是剑本身的样子 这是 ...

  3. 彻底解决Android 应用方法数不能超过65K的问题

    作为一名Android开发者,相信你对Android方法数不能超过65K的限制应该有所耳闻,随着应用程序功能不断的丰富,总有一天你会遇到一个异常: Conversion to Dalvik forma ...

  4. JS案例练习:图片切换+切换模式

    先附图: CSS样式部分: <style> *{;} body{font-family:'Microsoft YaHei';} .menu{margin:20px auto 0; widt ...

  5. OpenSSL s_server / s_client 应用实例

    netkiller openssl tls 目录[-] 12.6. s_server / s_client 12.6.1. SSL POP3 / SMTP / IMAP 12.6.2. server ...

  6. 推荐一个VS2015 插件 Favorite Documents

    随着解决方案越来越庞大,查找某个文件变的非常费神,考眼力 有了这个工具我们可以将常用的几个文件或文件夹添加到收藏夹中,随时展开双击即可到达收藏位置 从 视图>其他窗口中打开     安装 在Vi ...

  7. 8. String to Integer

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  8. java Vamei快速教程10 接口的继承和抽象类

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在实施接口中,我们利用interface语法,将interface从类定义中独立出 ...

  9. python_输入一个数,判断是否是素数

    while True: n=int(input('n=')) for i in range(2,n): if n%i==0: print("n is not 素数") break ...

  10. 前端安全之XSS和csrf攻击

    1.Csrf攻击概念: csrf攻击(Cross-site request forgery):跨站请求伪造; 2.Csrf攻击原理: 用户是网站A的注册用户,且登录进去,于是网站A就给用户下发cook ...