设计模式之观察者模式

2022-08-12 20:48:38 浏览数 (1)

什么是观察者模式

观察者模式定义了对象之间一种一对多的关系,即一个对象发生改变的时候,会通知其他相关的对象。

观察者模式的好处降低了观察目标(被观察者)和观者者的耦合关系。

使用场景:观察者模式一般用于订阅功能,微博订阅,当我们订阅了一个博主,当博主发布了文章就会通知我们。

我们看如上面的类图,它 其实就是2个接口和2个实现类。 subject(主题、观察目标、被观察者):这是一个接口定义了添加、删除、和通知观察者的方法 observer(观察者):这是一个接口定义了接收通知的方法。 concreateSubject:主题的具体实现方法,维护了一个观察者的list concreteObserber:观察者的具体实现方法。

实战小demo

我们假设本博客发布一篇文章,需要通知各位粉丝来阅读。 分析:主题、被观察者、观察者目标就是本博客,粉丝就是观察者。

被观察者接口

代码语言:javascript复制
package com.ding; 
public interface Subject { 
public void addObserver(Observer observer); 
public void removeObserver(Observer observer); 
public void notifyObserver(); 
} 

观察者接口

代码语言:javascript复制
package com.ding; 
public interface Observer { 
public void update(String msg); 
} 

被观察者实现类

代码语言:javascript复制
package com.ding; 
import java.util.ArrayList; 
import java.util.List; 
public class BlogSubject implements Subject{ 
// 面向接口编程,这里泛型是接口 
private List<Observer> observerList = new ArrayList<>(); 
/** 
* 添加观察者 
*/ 
@Override 
public void addObserver(Observer observer) { 
this.observerList.add(observer); 
} 
/** 
* 移除观察者 
*/ 
@Override 
public void removeObserver(Observer observer) { 
this.observerList.remove(observer); 
} 
/** 
* 发生改变通知所有的观察者 
*/ 
@Override 
public void notifyObserver() { 
this.observerList.forEach(o->{ 
o.update("我发布了新的文章。。。"); 
}); 
} 
} 

观察者实现类

代码语言:javascript复制
package com.ding; 
public class FansObserver1 implements Observer{ 
@Override 
public void update(String msg) { 
System.out.println("我是粉丝1:"   msg); 
} 
} 

测试

代码语言:javascript复制
package com.ding; 
public class ObserverTest { 
public static void main(String[] args) { 
BlogSubject blogSuject = new BlogSubject(); 
FansObserver1 fans1 = new FansObserver1(); 
FansObserver2 fans2 = new FansObserver2(); 
blogSuject.addObserver(fans1); 
blogSuject.addObserver(fans2); 
blogSuject.notifyObserver(); 
System.out.println("----------分割---------"); 
blogSuject.removeObserver(fans1); 
blogSuject.notifyObserver(); 
} 
} 
输出 
我是粉丝1:我发布了新的文章。。。 
我是粉丝2:我发布了新的文章。。。 
----------分割--------- 
我是粉丝2:我发布了新的文章。。。 

java自带的观察者模式

累了,以后再写

这短短的一生我们最终都会失去,不妨大胆一点,爱一个人,攀一座山,追一个梦

0 人点赞