设计模式系列--观察者模式

it2023-07-28  66

定义

观察者模式定义了对象之间的一对多依赖,让多个观察者对象同时监听一个主体对象。当主体对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新。

观察者模式主要用于在关联行为之间建立一套触发机制的场景,支持广播通信。

观察者模式也被称为 发布-订阅模式。

实现

场景:新闻社开发了一套新闻订阅服务,他们会给每个订阅了该服务的用户推送早间新闻邮件。

邮件服务器 MailServer

public class MailServer extends Observable { private static MailServer mailServer = new MailServer("每日早报服务器"); private String serverName; private MailServer(String serverName) { this.serverName = serverName; } public void publishMail(MailContent mailContent) { System.err.println("服务器发送邮件,邮件主题:" + mailContent.getTheme()); setChanged(); notifyObservers(mailContent); } public String getServerName() { return serverName; } public static MailServer getMailServer() { return mailServer; } }

新闻内容 MailContent

public class MailContent { private String theme; private String content; public MailContent(String theme, String content) { this.theme = theme; this.content = content; } public String getTheme() { return theme; } public String getContent() { return content; } }

邮件订阅者 MailSubscriber

public class MailSubscriber implements Observer { private String name; public MailSubscriber(String name) { this.name = name; } @Override public void update(Observable o, Object arg) { MailServer mailServer = (MailServer) o; MailContent mailContent = (MailContent) arg; System.out.println("\n"+this.name + "收到来自"+mailServer.getServerName()+"的邮件:"); System.out.println("主题:"+mailContent.getTheme()); System.out.println("内容:"+mailContent.getContent()); } }

测试 Test

public class Test { public static void main(String[] args) { MailServer mailServer = MailServer.getMailServer(); MailContent mailContent = new MailContent("今日头条", "震惊!在今日凌晨人民公园,区警察巡逻时发现一男子张三,竟然可以在公园躺椅上睡着"); //添加订阅者 mailServer.addObserver(new MailSubscriber("李丝丝")); mailServer.addObserver(new MailSubscriber("宿千千")); //发布邮件 mailServer.publishMail(mailContent); } }

通过输出结果可以发现,所有实现了 Observer 接口的 订阅者 都可以收到服务器的通知。

最新回复(0)