【设计模式】观察者模式

介绍

观察者模式又称为源收听模式,观察者与被观察者之间是一对多的关系,简而言之,观察者模式就是,当被观察者发生变动,系统会主动他通知观察者,从而做一些处理。

场景

接下来实现一个场景:演员与观众,演员刀哥在台上表演,只要刀哥一表演到绝活,台下观众便会发出雷鸣般的掌声。

事件抽象类

abstract class Event<T>{
    public abstract T getSource();
}

事件类

class PerformingSkillsEvent extends Event<Performer>{  
    long timestamp;  
    String info;  
    Performer source;  
  
    PerformingSkillsEvent(long timestamp,String info,Performer source){  
        this.timestamp=timestamp;  
        this.info=info;  
        this.source=source;  
    }  
  
    @Override  
    public Performer getSource(){  
        return this.source;  
    }  
  
}

观察者接口

interface Observe{  
    /** 
    * 鼓掌
    * /
    void actionClapping(PerformingSkillsEvent event);  
}

观察者

class Audience1 implements Observe {  
  
    @Override  
    public void actionClapping(PerformingSkillsEvent event) {  
        System.out.println("观众1号说:太棒了太棒了");  
    }  
  
}  
  
class Audience2 implements Observe {  
  
    @Override  
    public void actionClapping(PerformingSkillsEvent event) {  
        System.out.println("观众2号说:什么呀不如我");  
    }  
  
}

被观察者

class Performer{  
    /**  
     * 充当被观察者的属性  
     */
    boolean isWakeUp=false;  
    List<Observe> observeList=new ArrayList<>();  
  
    public void addListener(Observe observer){  
        observeList.add(observer);  
    }  
    PerformingSkillsEvent performingSkillsEvent=new PerformingSkillsEvent(System.currentTimeMillis(),"info",this);  
    public void performingSkills(){  
        isWakeUp=true;  
        for(Observe observe:observeList){  
            observe.actionClapping(performingSkillsEvent);  
        }  
    }  
  
}

测试

public static void main(String[] args){
    Performer performer = new Performer();  
    performer.addListener(new Audience1());  
    performer.addListener(new Audience2());  
    performer.performingSkills();
}

类图

完整代码

import java.util.ArrayList;  
import java.util.List;  
  
abstract class Event<T> {  
    public abstract T getSource();  
}  
  
class PerformingSkillsEvent extends Event<Performer> {  
    long timestamp;  
    String info;  
    Performer source;  
  
    PerformingSkillsEvent(long timestamp, String info, Performer source) {  
        this.timestamp = timestamp;  
        this.info = info;  
        this.source = source;  
    }  
  
    @Override  
    public Performer getSource() {  
        return this.source;  
    }  
  
}  
  
  
interface Observe {  
    /**  
     * 鼓掌  
     */  
    void actionClapping(PerformingSkillsEvent event);  
}  
  
class Audience1 implements Observe {  
    @Override  
    public void actionClapping(PerformingSkillsEvent event) {  
        System.out.println("观众1号说:太棒了太棒了");  
    }  
  
}  
  
class Audience2 implements Observe {  
  
    @Override  
    public void actionClapping(PerformingSkillsEvent event) {  
        System.out.println("观众2号说:什么呀不如我");  
    }  
  
}  
  
class Performer {  
    /**  
     * 充当被观察者的属性  
     */  
    boolean isWakeUp = false;  
    List<Observe> observeList = new ArrayList<>();  
  
    public void addListener(Observe observer) {  
        observeList.add(observer);  
    }  
  
    PerformingSkillsEvent performingSkillsEvent = new PerformingSkillsEvent(System.currentTimeMillis(), "info", this);  
  
    public void performingSkills() {  
        isWakeUp = true;  
        for (Observe observe : observeList) {  
            observe.actionClapping(performingSkillsEvent);  
        }  
    }  
}  
  
public class Main {  
    public static void main(String[] args) {  
        Performer performer = new Performer();  
        performer.addListener(new Audience1());  
        performer.addListener(new Audience2());  
        performer.performingSkills();  
    }  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值