- 从大姨妈的角度 来学习观察者模式
观察者模式概念:一个对象状态的变化会引起其他对象的相关变化,如会触发相关的方法
概念映射过来:当女生来大姨妈了,请各位相关人士积极主动的给予关爱
如下结果所示:
从大姨妈的角度 来学习观察者模式:
姨妈关怀队组建成功
【徐峥】加入队伍
【段一弘】加入队伍
【陶虹】加入队伍
陶虹:这几天心情不好,别惹我
姨妈关怀队紧急通知:陶虹 正在死去活来
坚持住:队友徐峥来了
坚持住:队友段一弘来了
结下来我们分析整个过程的演变:
-
宏观角度来讲,有个维系整件事情的线索。啥,观察/记录情绪不对劲的那几天,简单来说【日期】
-
那我们是不是需要明白谁来观察日历呢?没错,所有的相关人员都需要观察
-
明确了责任之后,我们来推演下一步会发生什么?
-
某天,女友发了一个朋友圈:"终究是一个人 默默的扛下所有的痛"
-
朋友们,兄弟们是不是应该有所表示了
-
故事讲完了:这就是观察者模式!
什么?讲了什么 又好像啥也没讲~~ 好吧 接着提炼
类图
我们紧接着提炼出类图:
代码
抽象日期类
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);
}
}
----
姨妈关怀队组建成功
【徐峥】加入队伍
【段一弘】加入队伍
【陶虹】加入队伍
陶虹:这几天心情不好,别惹我
姨妈关怀队紧急通知:陶虹 正在死去活来
坚持住:队友徐峥来了
坚持住:队友段一弘来了
更多知识学习,请关注公众号:[洪洞小猿在路上]