設(shè)計(jì)模式—行為型模式之觀察者模式
觀察者模式(Observer Pattern):定義對(duì)象間的一種一對(duì)多依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象狀態(tài)發(fā)生改變時(shí),其相關(guān)依賴對(duì)象皆得到通知并被自動(dòng)更新。觀察者模式又叫做發(fā)布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監(jiān)聽(tīng)器(Source/Listener)模式或從屬者(Dependents)模式。這是一種對(duì)象行為型模式。
觀察者模式有如下角色:
-
Subject: 目標(biāo)
-
ConcreteSubject: 具體目標(biāo)
-
Observer: 觀察者
-
ConcreteObserver: 具體觀察者
示例
比如現(xiàn)在大火的主播,可以直播賣貨,直播賣貨時(shí)可以通知給粉絲,結(jié)束賣貨時(shí)也可以通知給粉絲。我們可以在主播中維護(hù)一個(gè)粉絲的列表,來(lái)進(jìn)行通知。
代碼如下:
/**
* 抽象主播類
*/
public abstract class AbstarctAnchor {
//添加粉絲
abstract void addFans(AbstarctFans fans);
//通知粉絲
abstract void notifyFans(String msg);
}
/**
抽象粉絲類
*/
public abstract class AbstarctFans {
//接收消息
abstract void acceptMsg(String msg);
//關(guān)注主播
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("我是賣奧特曼的主播,我來(lái)賣奧特曼了....");
//通知粉絲
notifyFans("主播來(lái)賣貨了");
}
//結(jié)束賣奧特曼
public void end(){
log.info("奧特曼賣沒(méi)了....");
//通知粉絲
notifyFans("主播結(jié)束賣貨了");
}
@Override
void addFans(AbstarctFans fans) {
fansList.add(fans);
}
@Override
void notifyFans(String msg) {
//獲取所有粉絲進(jìn)行通知
for (AbstarctFans abstarctFans : fansList) {
abstarctFans.acceptMsg(msg);
}
}
}
忠實(shí)粉絲和黑粉類如下
/**
* 忠實(shí)粉絲
*/
@Slf4j
public class LoyalFans extends AbstarctFans{
@Override
void acceptMsg(String msg) {
log.info("賣奧特曼的主播來(lái)了,他說(shuō):"+msg);
}
}
/**
* 黑粉
*/
@Slf4j
public class AntiFan extends AbstarctFans{
@Override
void acceptMsg(String msg) {
log.info("這個(gè)賣奧特曼的主播賣的奧特曼不會(huì)發(fā)光,別買?。?!");
}
}
測(cè)試類如下
public class ObserverTest {
public static void main(String[] args) {
//賣奧特曼的主播對(duì)象
SellingUltramanAnchor anchor = new SellingUltramanAnchor();
//忠實(shí)粉絲1
AbstarctFans loyalFans1 = new LoyalFans();
loyalFans1.follow(anchor);
//忠實(shí)粉絲2
AbstarctFans loyalFans2 = new LoyalFans();
loyalFans2.follow(anchor);
//黑粉
AbstarctFans antiFan = new AntiFan();
antiFan.follow(anchor);
//開(kāi)播
anchor.selling();
//結(jié)束直播
anchor.end();
}
}
運(yùn)行結(jié)果如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-815200.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-815200.html
到了這里,關(guān)于設(shè)計(jì)模式—行為型模式之觀察者模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!