从大姨妈的角度 来学习观察者模式

183 阅读3分钟
  • 从大姨妈的角度 来学习观察者模式

观察者模式概念:一个对象状态的变化会引起其他对象的相关变化,如会触发相关的方法

概念映射过来:当女生来大姨妈了,请各位相关人士积极主动的给予关爱

如下结果所示:

从大姨妈的角度 来学习观察者模式:
姨妈关怀队组建成功
【徐峥】加入队伍
【段一弘】加入队伍
【陶虹】加入队伍
陶虹:这几天心情不好,别惹我
姨妈关怀队紧急通知:陶虹 正在死去活来
坚持住:队友徐峥来了
坚持住:队友段一弘来了

结下来我们分析整个过程的演变:

  1. 宏观角度来讲,有个维系整件事情的线索。啥,观察/记录情绪不对劲的那几天,简单来说【日期】

  2. 那我们是不是需要明白谁来观察日历呢?没错,所有的相关人员都需要观察

  3. 明确了责任之后,我们来推演下一步会发生什么?

    • 某天,女友发了一个朋友圈:"终究是一个人 默默的扛下所有的痛"

    • 朋友们,兄弟们是不是应该有所表示了

故事讲完了:这就是观察者模式!

09D73D42-51D5-4245-A659-200CC9C78562_4_5005_c.jpeg

什么?讲了什么 又好像啥也没讲~~ 好吧 接着提炼

类图

我们紧接着提炼出类图:

代码

抽象日期类

package com.example.designpattern.observer;

import java.util.ArrayList;

/**
 * 被观察者对象
 */
public abstract class Date {

    //队伍名称
    protected String allyName;

    //定义观察者集合用于存储所有队员
    protected ArrayList<Lover> observers =  new ArrayList<Lover>();

    /**
     * 注册方法
     */
    public void attach(Lover observer){
        System.out.println("【"+observer.getName()+"】加入队伍");
        observers.add(observer);
    }

    /**
     * 注销方法
     */
    public void detach(Lover observer){
        observers.remove(observer);
    }

    /**
     * 通知方法
     */
    public abstract void notifyAllObserver(String name);
}

姨妈日期类

package com.example.designpattern.observer;

/**
 * 被观察者的具体对象
 */
public class AuntDate extends Date{

    public AuntDate(String allyName) {
        System.out.println(allyName+"组建成功");
        this.allyName = allyName;
    }

    @Override
    public void notifyAllObserver(String name) {
        System.out.println(this.allyName +"紧急通知:"+ name+" 正在死去活来");
        for (Lover lover : observers) {
            if (!lover.getName().equals(name)) {
                lover.help();
            }
        }

    }
}

抽象类:恋人类

package com.example.designpattern.observer;

/**
 * 抽象观察者-恋人
 */
public abstract class Lover {

    public abstract String getName();

    public abstract void setName(String name);

    /**
     * 帮助的方法
     */
    public abstract void help();

    /**
     * 需要帮助的方法
     */
    public abstract void needYourhelp(Date subject);
}

具体恋人:女生类

package com.example.designpattern.observer;

/**
 * 观察者-女生
 */
@Data
@Getter
@Setter
@AllArgsConstructor
public class Women extends Lover {

    protected String name;

    @Override
    public void help() {
        System.out.println(this.name +":法师在此");
    }

    @Override
    public void needYourhelp(Date subject) {
        System.out.println(this.name+":这几天心情不好,别惹我");
        subject.notifyAllObserver(this.name);
    }
}

具体恋人:男生

package com.example.designpattern.observer;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;

/**
 * 观察者-男生
 */
@Data
@Getter
@Setter
@AllArgsConstructor
public class Man extends Lover {
    
    private String name;

    @Override
    public void help() {
        System.out.println("坚持住:队友"+ this.name +"来了");
    }

    @Override
    public void needYourhelp(Date subject) {
        subject.notifyAllObserver(name);
    }
}

测试类

package com.example.designpattern.observer;

/**
 * 观察者模式 测试类
 */
public class Client {

    public static void main(String[] args) {
        AuntDate subject = new AuntDate("姨妈关怀队");

        //定义3个观察者对象
        Man cavalryObserver = new Man("徐峥");
        Man gunnerObserver = new Man("段一弘");
        Women gunnerObserver1 = new Women("陶虹");
        //加入队伍
        subject.attach(cavalryObserver);
        subject.attach(gunnerObserver);
        subject.attach(gunnerObserver1);
        //陶虹需要帮助
        gunnerObserver1.needYourhelp(subject);
 
    }
}

----

姨妈关怀队组建成功
【徐峥】加入队伍
【段一弘】加入队伍
【陶虹】加入队伍
陶虹:这几天心情不好,别惹我
姨妈关怀队紧急通知:陶虹 正在死去活来
坚持住:队友徐峥来了
坚持住:队友段一弘来了

更多知识学习,请关注公众号:[洪洞小猿在路上]