设计模式—行为型模式之观察者模式
观察者模式(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("主播结束卖货了");}@Overridevoid addFans(AbstarctFans fans) {fansList.add(fans);}@Overridevoid notifyFans(String msg) {//获取所有粉丝进行通知for (AbstarctFans abstarctFans : fansList) {abstarctFans.acceptMsg(msg);}}
}
忠实粉丝和黑粉类如下
/*** 忠实粉丝*/
@Slf4j
public class LoyalFans extends AbstarctFans{@Overridevoid acceptMsg(String msg) {log.info("卖奥特曼的主播来了,他说:"+msg);}
}
/*** 黑粉*/
@Slf4j
public class AntiFan extends AbstarctFans{@Overridevoid acceptMsg(String msg) {log.info("这个卖奥特曼的主播卖的奥特曼不会发光,别买!!!");}
}
测试类如下
public class ObserverTest {public static void main(String[] args) {//卖奥特曼的主播对象SellingUltramanAnchor anchor = new SellingUltramanAnchor();//忠实粉丝1AbstarctFans loyalFans1 = new LoyalFans();loyalFans1.follow(anchor);//忠实粉丝2AbstarctFans loyalFans2 = new LoyalFans();loyalFans2.follow(anchor);//黑粉AbstarctFans antiFan = new AntiFan();antiFan.follow(anchor);//开播anchor.selling();//结束直播anchor.end();}
}
运行结果如下: