设计模式—行为型模式之观察者模式
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。这是一种对象行为型模式。
观察者模式有如下角色:
-
Subject: 目标
-
ConcreteSubject: 具体目标
-
Observer: 观察者
-
ConcreteObserver: 具体观察者
示例
比如现在大火的主播,可以直播卖货,直播卖货时可以通知给粉丝,结束卖货时也可以通知给粉丝。我们可以在主播中维护一个粉丝的列表,来进行通知。
代码如下:
/**
* 抽象主播类
*/
public abstract class AbstarctAnchor {
//添加粉丝
abstract void addFans(AbstarctFans fans);
//通知粉丝
abstract void notifyFans(String msg);
}
/**
抽象粉丝类
*/
public abstract class AbstarctFans {
//接收消息
abstract void acceptMsg(String msg);
//关注主播
public void follow(AbstarctAnchor anchor){
anchor.addFans(this);
}
}
卖奥特曼的主播为:
/**
* 卖奥特曼的主播
*/
@Slf4j
public class SellingUltramanAnchor extends AbstarctAnchor{
//粉丝列表
private List<AbstarctFans> fansList = new ArrayList<>();
//卖奥特曼
public void selling(){
log.info("我是卖奥特曼的主播,我来卖奥特曼了....");
//通知粉丝
notifyFans("主播来卖货了");
}
//结束卖奥特曼
public void end(){
log.info("奥特曼卖没了....");
//通知粉丝
notifyFans("主播结束卖货了");
}
@Override
void addFans(AbstarctFans fans) {
fansList.add(fans);
}
@Override
void notifyFans(String msg) {
//获取所有粉丝进行通知
for (AbstarctFans abstarctFans : fansList) {
abstarctFans.acceptMsg(msg);
}
}
}
忠实粉丝和黑粉类如下
/**
* 忠实粉丝
*/
@Slf4j
public class LoyalFans extends AbstarctFans{
@Override
void acceptMsg(String msg) {
log.info("卖奥特曼的主播来了,他说:"+msg);
}
}
/**
* 黑粉
*/
@Slf4j
public class AntiFan extends AbstarctFans{
@Override
void acceptMsg(String msg) {
log.info("这个卖奥特曼的主播卖的奥特曼不会发光,别买!!!");
}
}
测试类如下
public class ObserverTest {
public static void main(String[] args) {
//卖奥特曼的主播对象
SellingUltramanAnchor anchor = new SellingUltramanAnchor();
//忠实粉丝1
AbstarctFans loyalFans1 = new LoyalFans();
loyalFans1.follow(anchor);
//忠实粉丝2
AbstarctFans loyalFans2 = new LoyalFans();
loyalFans2.follow(anchor);
//黑粉
AbstarctFans antiFan = new AntiFan();
antiFan.follow(anchor);
//开播
anchor.selling();
//结束直播
anchor.end();
}
}
运行结果如下: