设计模式—行为型模式之观察者模式

设计模式—行为型模式之观察者模式

观察者模式(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();
    }
}

运行结果如下:

运行截图

相关推荐

  1. 设计模式(013)行为观察模式

    2024-01-22 06:54:01       33 阅读
  2. 设计模式行为设计模式——观察模式

    2024-01-22 06:54:01       43 阅读
  3. 设计模式_行为模式_观察模式

    2024-01-22 06:54:01       64 阅读
  4. 设计模式_行为模式_观察模式

    2024-01-22 06:54:01       61 阅读
  5. 设计模式行为模式观察模式

    2024-01-22 06:54:01       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-22 06:54:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-22 06:54:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-22 06:54:01       82 阅读
  4. Python语言-面向对象

    2024-01-22 06:54:01       91 阅读

热门阅读

  1. P8738 [蓝桥杯 2020 国 C] 天干地支

    2024-01-22 06:54:01       55 阅读
  2. 实时流媒体传输开源库——Live555

    2024-01-22 06:54:01       52 阅读
  3. SpringBoot整理-Spring Boot与Spring MVC的区别

    2024-01-22 06:54:01       61 阅读
  4. Apache Hive(二)

    2024-01-22 06:54:01       54 阅读
  5. for...in、for...of、for...Each的详细区别!

    2024-01-22 06:54:01       51 阅读
  6. 设计模式-命令模式

    2024-01-22 06:54:01       64 阅读
  7. kotlin flatten 与 flatMap

    2024-01-22 06:54:01       54 阅读