大家好,我是洪爵,今天想给大家讲一下设计模式中的行为型模式之观察者模式。
什么是行为型模式捏?行为型的设计模式是着重关注于对象之间的通信的。
观察者模式是什么捏?
相信大家或多或少已经接触过观察者模式了,不信?我来给你举个栗子。
比如你点开微博,小红书等等的这些信息流软件,注册之后会让你选择一些标签,让你订阅些感兴趣的标签或内容。这些就属于观察者模式,你点击之后会自动把你和这个标签关联起来,下次打了这个标签的内容就会推送给你,这就是发布-订阅。
同样的,我们还是先上代码,再来讲解,让大家有一个思考的过程。这次的例子是预约还没有上线游戏的一个例子,预约后,就能获取到游戏的状态变更。
// Game.java
// 抽象游戏类
public abstract class Game {
// 存放预约游戏的人(称为观察者)
protected List<Observer> observers = new ArrayList<Observer>();
// 游戏的状态
protected int state;
public int getState() {
return state;
}
// 游戏状态变更, 通知观察者
public void setState(int state) {
this.state = state;
notifyObservers();
}
// 增加观察者
public void addObServer(Observer observer) {
observers.add(observer);
}
// 通知观察者
public void notifyObservers() {
for(Observer observer : observers) {
observer.update();
}
}
}
// LOLGame.java
public class LOLGame extends Game {
// 具体游戏
}
// Observer.java
// 抽象观察者
public abstract class Observer {
// 通知具体实现
public abstract void update();
}
// lol游戏的观察者
public class LOLObserver extends Observer {
// 扩展独有的一些属性
private String name;
private String sex;
public LOLObserver(String name, String sex) {
this.name = name;
this.sex = sex;
}
@Override
public void update() {
System.out.println(this.name + "被通知了");
}
}
// Client.java
public class Client {
public static void main(String[] args) {
// 创建lol手游
Game lolGame = new LOLGame();
// 预约游戏的人
lolGame.addObServer(new LOLObserver("HJH", "male"));
lolGame.addObServer(new LOLObserver("GCZ", "female"));
lolGame.addObServer(new LOLObserver("BAT", "male"));
// lol手游状态变更, 通知预约的人
lolGame.setState(1);
}
}
/*console output
HJH被通知了
GCZ被通知了
BAT被通知了
*/
类图
我们建了两个抽象类,Game和Observer,具体的游戏可以extends Game去拓展,符合开闭原则(对扩展开发,对修改关闭)和依赖倒转原则,针对接口编程,依赖于抽象而不是依赖于具体。
Game去维护一个list,这个list可以存储所有观察者的信息,当Game的状态变更的时候,去通知到观察者们,通过一个迭代for循环就能通知完毕。
具体的通知方法,需要Observer去实现,对于每一种类的Observer都需要有自己的update实现。
观察者模式完美的将观察者和被观察的对象分离开,提高了系统的可维护性和重用性。当一个对象的改变需要通知另外的对象的时候,并且我们不需要知道这个对象到底是谁,达到低耦合的状态,就需要使用到观察者模式,因为List存储的是Observer,只要这个类继承自Observer,那么就能加进到这个list中,进入观察中的状态。
Java中已经有对观察者模式支持的类,大家可以去看源码:java.util.Observer和java.util.Observable去学习和了解。
今天的观察者模式就到这里啦!
当你凝望深渊时,深渊也在凝望你… …
所以不学好观察者模式,被人凝望都感知不到!多可怕,赶紧行动起来!(胡言胡语)
愿每个人都能带着怀疑的态度去阅读文章并探究其中原理。
道阻且长,往事作序,来日为章。
期待我们下一次相遇!