博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式----观察者模式UML和实现代码(5个必须掌握的设计模式)
阅读量:6979 次
发布时间:2019-06-27

本文共 2457 字,大约阅读时间需要 8 分钟。

hot3.png

一、什么是观察者模式?

观察者模式(Observer)定义:

观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式),一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

类型:形为型模式 

顺口溜:中访策备迭 模命状职解

二、观察者模式UML

014140_7tcJ_2003960.png

三、JAVA代码实现

package com.amosli.dp.behavior.observer;public abstract class Observer {	abstract void update();}package com.amosli.dp.behavior.observer;import java.util.ArrayList;import java.util.List;public abstract class Subject {	private List
 observers = new ArrayList
(); public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void notifyObserver() { for (Observer observer : observers) { observer.update(); } }}package com.amosli.dp.behavior.observer;public class ConcreteSubject extends Subject { private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; }}package com.amosli.dp.behavior.observer;public class ConcreteObserver extends Observer { private String name; private ConcreteSubject subject; public ConcreteObserver(ConcreteSubject subject, String name) { this.subject = subject; this.name = name; } private String observerState; public String getState() { return observerState; } public void setState(String state) { this.observerState = state; } @Override void update() { observerState = subject.getSubjectState(); System.out.println("观察者:" + name + "  您订阅的主题状态有更新: " + observerState); }}package com.amosli.dp.behavior.observer;public class Client { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); subject.attach(new ConcreteObserver(subject,"xa")); subject.attach(new ConcreteObserver(subject,"xb")); subject.attach(new ConcreteObserver(subject,"xc")); subject.setSubjectState("amosli又更新了设计模式系列文章哦!"); subject.notifyObserver(); }}

输出:

014325_2AmV_2003960.png

四、使用场景

1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。 

2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。 

五、优缺点

1、优点

1)、 Subject和Observer之间是松偶合的,分别可以各自独立改变。 

2)、 Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。 
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

2、缺点

 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

 2、 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进  行循环调用,可能导致系统崩溃。

 3、   观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

 六、源码地址

本系列文章源码地址,  欢迎Fork  & Star !!

转载于:https://my.oschina.net/u/2003960/blog/541199

你可能感兴趣的文章
二分查找
查看>>
小公司程序员怎么进大公司
查看>>
PS 拉伸大长腿
查看>>
cheat engine lua
查看>>
软件架构设计学习总结(1):标准Web系统的架构分层
查看>>
JPA 复杂查询 - Querydsl
查看>>
Alipay秘钥问题
查看>>
workerman结合laravel开发在线聊天应用的示例代码
查看>>
程序员新手 0年份等级 指导(一) 开发人员IT架构总览
查看>>
poj 2063完全背包
查看>>
Least Common Ancestors 分类: ACM TYPE ...
查看>>
数据结构之快速排序
查看>>
《代码敲不队》第八次团队作业:Alpha冲刺 第二天
查看>>
如何在JSP页面中获取当前系统时间<转>
查看>>
Java并发编程-信号量
查看>>
错误 1 “System.Data.DataRow.DataRow(System.Data.DataRowBuilder)”不可访问,因为它受保护级别限制...
查看>>
addTwoNumbers
查看>>
性能测试初学_loadrunner base64/md5 编码 解码
查看>>
意见汇总
查看>>
js 字符串转换成数字的 三种方法
查看>>