观察者模式(Observer)
简介指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
模式定义
指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
模式优缺点
优点
降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系 目标与观察者之间建立了一套触发机制 符合开闭原则缺点
目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率
应用场景
- 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象
- 当一个抽象模型有两个方面,其中一个方面依赖于另一方面时,可将这二者封装在独立的对象中以使它们可以各自独立地改变和复用
模式结构
- 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
- 具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
- 抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
- 具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
模式实现
package com.company.observer;
import javax.security.auth.Subject;
import java.util.ArrayList;
import java.util.List;
public class ObserverPattern {
public static void main(String[] args) {
Object subject = new ConcreteObject();
//实例化两个观察者
ConcreteObserver1 observer1 = new ConcreteObserver1();
ConcreteObserver2 observer2 = new ConcreteObserver2();
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.notifyObserver();
subject.removeObserver(observer2);
subject.notifyObserver();
}
}
//抽象目标
abstract class Object{
protected List<Observer> observers = new ArrayList<>();
//添加观察者
public void addObserver(Observer observer){
observers.add(observer);
}
//删除观察者
public void removeObserver(Observer observer){
observers.remove(observer);
}
public abstract void notifyObserver();
}
//具体目标
class ConcreteObject extends Object{
@Override
public void notifyObserver() {
for(Observer observer:observers){
observer.update();
}
}
}
//观察者接口
interface Observer{
void update();//操作
}
//具体观察者1
class ConcreteObserver1 implements Observer{
@Override
public void update() {
System.out.println("具体观察者1作出反应!");
}
}
//具体观察者2
class ConcreteObserver2 implements Observer{
@Override
public void update() {
System.out.println("具体观察者2作出反应!");
}
}
运行结果:
具体观察者1作出反应!
具体观察者2作出反应!
具体观察者1作出反应!
如果在使用Gin框架编写web应用程序中,如果里面包含了模板文件和静态文件,我们如何进行打包呢?本文主要记录该操作。
CFSSL是CloudFlare开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。
dd命令具有复制文件、转换文件和格式化文本的功能。但是这个命令的使用也要谨慎。这里不做过多说明,就是提示在使用的时候一定要注意。错误的操作可能会对系统造成不能挽回的损坏。
对加密相关概念整理
PHP作为一门非常流行的语言,但是有时很多人会觉得PHP效率不高,也许很多人在初次使用的时候对PHP本身还不够了解,所以造成了大家对PHP运行效率低的误解。作为脚本语言,我们也不能否认PHP跟其他编译型语言效率对比。本文我们带大家看看如何来对PHP进行优化。
快速生成表格
Electron页面跳转、浏览器打开链接和打开新窗口
在使用Git的过程中,不想每次都输入用户名和密码去拉取代码,所以就需要保存这些信息,那么既然有保存了,就必须有清除功能。
Docker编译镜像出现:fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.12/main: temporary error (try again later)
WARNING: Ignoring APKINDEX.2c4ac24e.tar.gz: No such file or directory问题
在Mac电脑中,如何对Git的用户名和密码进行修改呢?起初不懂Mac,所以整了很久,本文将记录如何对这个进行操作,以便后期使用。