设计模式之观察者模式

写在前面

本文一起看下一种行为型设计模式,观察者模式。

1:介绍

1.1:什么时候使用观察者设计模式

pub,sub场景。

1.2:UML类图

观察者设计模式,包含如下元素:

1:Observer
    定义了如何接受通知的方法
2:ConcreteObserver
    具体的Observer,具体处理通知
2:Subject
    被观察者,维护Observer集合,以及通知方法
3:ConcreteSubject
    具体的Subject实现类,在通知方法中通知维护的Observer集合

2:实例

源码 。

2.1:场景

大爷,大妈们等着抢购超时的搞活动商品,一旦有活动通知就过去了,哈哈哈!!!

2.2:程序

  • 老人Observer
// 老人观察者类
public interface OldPeopleObserver {
    // 老人行动了,要去超市抢购productName了
    void action(String productName);
}
  • 王大爷和李大妈Observer
// 王大爷具体类
public class WangDaYeObserver implements OldPeopleObserver {
    @Override
    public void action(String productName) {
        System.out.println("王大爷抢购:" + productName);
    }
}

// 李大妈观察者具体类
public class LiDaMaObserver implements OldPeopleObserver {
    @Override
    public void action(String productName) {
        System.out.println("李大妈抢购:" + productName);
    }
}
  • 超市Subject接口
public interface SuperMarketSubject {
    // 添加老人观察这类
    void addOldPeopleObserver(OldPeopleObserver oldPeopleObserver);
    // 删除老人观察这类
    void removeOldPeopleObserver(OldPeopleObserver oldPeopleObserver);
    // 发布商品抢购的事件,通知老人观察者
    void notify(String productName);
}
  • 物美超市具体Subject类

有其它超市,比如沃尔玛等也是类似定义。

// 物美超市主题类
// 如果是有其它超市的话,可以类比实现
public class WuMeiSubject implements SuperMarketSubject {
    private List<OldPeopleObserver> oldPeopleObservers = new ArrayList<>();

    @Override
    public void addOldPeopleObserver(OldPeopleObserver oldPeopleObserver) {
        oldPeopleObservers.add(oldPeopleObserver);
    }

    @Override
    public void removeOldPeopleObserver(OldPeopleObserver oldPeopleObserver) {
        oldPeopleObservers.remove(oldPeopleObserver);
    }

    @Override
    public void notify(String productName) {
        oldPeopleObservers.forEach(oldPeopleObserver -> oldPeopleObserver.action(productName));
    }
}
  • 客户端类
public static void main(String[] args) {
    // 创建主题类
    SuperMarketSubject subject = new WuMeiSubject();
    // 创建李大妈观察者类
    LiDaMaObserver liDaMaObserver = new LiDaMaObserver();
    // 创建王大爷观察者类
    WangDaYeObserver wangDaYeObserver = new WangDaYeObserver();
    // 将李大妈和王大爷添加到物美主体类中,等待接受来自物美超市的优惠活动
    subject.addOldPeopleObserver(liDaMaObserver);
    subject.addOldPeopleObserver(wangDaYeObserver);

    System.out.println("----------西瓜搞活动----------");
    subject.notify("西瓜");

    System.out.println("----------香菜搞活动----------");
    subject.notify("香菜");
}

运行:

----------西瓜搞活动----------
李大妈抢购:西瓜
王大爷抢购:西瓜
----------香菜搞活动----------
李大妈抢购:香菜
王大爷抢购:香菜

写在后面

参考文章列表

秒懂设计模式之观察者模式(Observer Pattern) 。

你可能感兴趣的:(设计模式,设计模式,观察者模式)