观察者模式是什么玩意,我带你走进去,走出来

观察者模式是什么玩意,我带你走进去,走出来

首页冒险解谜观察者系统重复更新时间:2024-08-03

关注我并转发此文,私信找我领取设计模式相关学习视频哦!!!!

好了废话不多说,咱们开撸观察者模式


定义

观察者三个字大家乍一听,最先想到的是什么,我最开始听到这三个字的时候,想到的是特务、监视、监听,哈哈,可能是谍战片看多了。我们可以把观察者当成中间第三者,负责收集消息和发布消息的人,比如:在学校上自习的时候,大家肯定都有过交头接耳、各种玩耍的经历,这时总会有一个“放风”的小伙伴,当老师即将出现时及时“通知”大家老师来了,这个小伙伴我们就可以理解为观察者,他负责收集情报,并通知对这个情报感兴趣的其他小伙伴。

观察者模式其实也就是我们经常听到的一个词:发布订阅模式(模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式),相信用过redis的小伙伴,肯定知道这个词。其实主要思想就是:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。


实现方式

下面我用一个通知工人消息的例子给大家具体演示一下,要实现观察者模式需要用的各种角色及实现的方法。

/** * 角色抽象类 * */ public interface Watched { public void addWatcher(Watcher watcher); //添加观察者(工人) public void removeWarcher(Watcher watcher);//删除观察者(工人) public void notifyWatcher(String str);//通知观察者(工人) }

/** * 角色实现类 */ public class WatchedClass implements Watched { //维护一个观察者(工人)的集合 private ArrayList<Watcher> wList = new ArrayList<Watcher>(); private ArrayList<WorkerWatcher> wList = new ArrayList<WorkerWatcher>(); @Override public void addWatcher(WorkerWatcher workerWatcher) { wList.add(workerWatcher); } @Override public void removeWarcher(WorkerWatcher workerWatcher) { wList.remove(workerWatcher); } @Override public void notifyWatcher(String str) { //遍历工人集合,将消息通知给每个工人 for (WorkerWatcher workerWatcher : wList) { /* 此处只是个简单的示例,比如这可以根据我们工人的等级,收到不同的消息, 或者细化发送模型和工人模型完成我们想要达到的效果 */ workerWatcher.updateSelf(str); } }

/** * 观察者抽象接口,也就是工人的抽象 */ public interface WorkerWatcher { public void updateSelf(String str); }

/** * 观察者实现类 车间主任 */ public class Director implements WorkerWatcher { private final static String MSG = "主任你好,您收到了最新消息:"; private String name; public Director(String name) { this.name = name; } @Override public void updateSelf(String str) { System.out.println(this.name MSG str); } }

/** * 观察者实现类 普通工人 */ public class WorkerClass implements WorkerWatcher { private final static String MSG = " 您好,您收到了最新消息:"; private String name; public WorkerClass(String name) { this.name = name; } @Override public void updateSelf(String str) { System.out.println(this.name MSG str); } }

/** * 观察者模式使用Demo * 1:角色抽象类 * 2:角色实现类 * 3:观察者抽象类 * 4:观察者实现类,可以多个实现类,同时观察角色类,通知后完成不同的功能 * 具体就是角色类提供添加和删除观察者的方法,同时提供通知所有观察者的方法, * 观察者类接收通知方法,执行操作 */ public class Client { public static void main(String[] args) { WatchedClass people = new WatchedClass(); WorkerWatcher director = new Director("李小楠"); WorkerWatcher worker = new WorkerClass("胡小然"); people.addWatcher(director); people.addWatcher(worker); //通知所有的观察者我要下班啦 people.notifyWatcher("下班啦"); //将普通工人从通知列表移出 people.removeWarcher(worker); //通知主任去聚餐 people.notifyWatcher("去聚餐"); } }

执行结果如下图:


优缺点

优点:

缺点:


总结

public class WorkerObservable { /** * JDK 支持的观察者模式使用Demo(所有的设计模式中,JDK只对观察者模式进行了支持,其他的都需自己设计) * 和自己写的观察者模式基本相同,可以看下源码就理解啦 是个重要的模式哦 */ public static void main(String[] args) { obServableClass obServableClass = new obServableClass(); Observer Director1 = new Director1("胡小然"); Observer Worker1 = new Worker1("李小楠"); obServableClass.addObserver(Director1); obServableClass.addObserver(Worker1); obServableClass.run("下班了"); } } //就是上面的 角色实现类,Observable是jdk帮我们实现的通知类 class obServableClass extends Observable { public void run(String str) { this.setChanged();// 变更成chang状态 this.notifyObservers(str); } } //具体的工人实现类,车间主任,Observer就是 角色抽象类 class Director1 implements Observer { private final static String MSG = "主任你好,您收到了最新消息:"; private String name; public Director1(String name) { this.name = name; } @Override public void update(Observable o, Object arg) { System.out.println(this.name MSG arg); } } //具体的工人实现类,普通工人 class Worker1 implements Observer { private final static String MSG = " 您好,您收到了最新消息:"; private String name; public Worker1(String name) { this.name = name; } @Override public void update(Observable o, Object arg) { System.out.println(this.name MSG arg); } }


最后和每次一样,放张设计模式学习视频的截图,感兴趣的小伙伴,关注转发后私聊我获取哦

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved