浅谈Observer观察者模式

return number;

}

public void execuate() {

for(int i=0;i<20;i++){

number=random.nextInt(60);

notifyObserver();

}

}

}

package zyr.dp.observer;

public interface Observer {

public abstract void update(NumberGenerator object);

}

package zyr.dp.observer;

public class DigitalObserver implements Observer {

public void update(NumberGenerator object) {

System.out.println(“DigitalObserver:”+object.getNumber());

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

package zyr.dp.observer;

public class GraphObserver implements Observer {

public void update(NumberGenerator object) {

System.out.print(“GraphObserver:”);

for(int i=0;i<object.getNumber();i++){

System.out.print(“*”);

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println();

}

}

package zyr.dp.observer;

public class Main {

public static void main(String[] args) {

NumberGenerator numberGenerator=new RandomNumberGenerator();

numberGenerator.add(new DigitalObserver());

numberGenerator.add(new GraphObserver());

numberGenerator.execuate();

}

}

1157683-20180630211417746-1587568869.gif

由此可以看到当被观察者的状态发生改变的时候会主动通知观察者,使用notifyObserver的方法将自己的状态传递过去,因为是自己定义的被观察者的抽象类以及接口,因此使用起来非常的方便,代码也不是很多,能够按照自己的要求来完成更新操作,对比与仲裁者模式,被观察者是主动将自己的内容传递给观察者的,而仲裁者模式中,组员是本身就已经组合进了仲裁者之中,这也是一点不同。代码比较简单,这里被观察者使用了抽象类而不使用接口的原因是需要定义对观察者对象的委托,因此使用了抽象类,而观察者只用了update方法将被观察者通过参数传递的方式委托进来,因此使用接口更加清晰一点,当然抽象类也可以,只不过能使用接口的就不要使用抽象类,因为一个类只能继承一个父类,但是可以实现很多接口。

(二)、使用java自带的观察者模式

package zyr.dp.java;

import java.util.Observable;

import java.util.Random;

public class RandomNumberGenerator extends Observable {

private Random random=new Random();

private int number;

public int getNumber(){

return number;

}

public void execuate() {

for(int i=0;i<20;i++){

number=random.nextInt(60);

setChanged();

notifyObservers();

}

}

}

package zyr.dp.java;

import java.util.Observable;

import java.util.Observer;

public class DigitalObserver implements Observer {

public void update(Observable object, Object arg) {

System.out.println(“DigitalObserver为:”+((RandomNumberGenerator)object).getNumber());

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

package zyr.dp.java;

import java.util.Observable;

import java.util.Observer;

public class GraphObserver implements Observer {

public void update(Observable object, Object arg) {

System.out.print(“GraphObserver为:”);

for(int i=0;i<((RandomNumberGenerator)object).getNumber();i++){

System.out.print(“*”);

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println();

}

}

package zyr.dp.java;

import java.util.Observable;

public class Main {

public static void main(String[] args) {

Observable observable=new RandomNumberGenerator();

observable.addObserver(new DigitalObserver());

observable.addObserver(new GraphObserver());

((RandomNumberGenerator)observable).execuate();

}

}

可以看到在java自定义的观察者模式中,首先要修改setChanged();来使notifyObservers生效,其次,传递的参数不是很灵活,需要强制转换成我们想要的东西,最后在使用的时候也需要强制转换,这是比较麻烦的,并且被观察者也是继承了抽象类Observable,不方便以后功能的扩展,如果以后再想继承其它的类就很麻烦了。我们自己设计的时候,可以使用某些方式把抽象类变成接口,不过也需要一定的操作。

三、《Head First 设计模式》读后感

1、观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

2、松耦合的威力。

设计原则:

找出程序中会变化的方面,然后将其和固定不变的方面相分离?
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

读者福利

由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

更多笔记分享

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
伴**

[外链图片转存中…(img-qpUv9mfs-1713743525094)]

[外链图片转存中…(img-eR8NiJod-1713743525094)]

[外链图片转存中…(img-rOjGlg9g-1713743525094)]

更多笔记分享

[外链图片转存中…(img-f7ssbZP5-1713743525095)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值