Java学习之:观察者模式(Observer)

本文介绍了Java设计模式中的观察者模式,通过一个厨师和不同观察者的案例展示了其核心设计和实现。厨师(Subject)作为被观察者,拥有端茶和上菜的观察者(Observer)列表。当厨师准备菜品时,会触发观察者执行相应的行为,如端茶Observer负责送餐,上菜Observer负责制作茶水。代码示例展示了如何创建和使用这些观察者。
摘要由CSDN通过智能技术生成

核心设计

  • 一个 subject 里面聚合了一个观察者的列表,你可以把这个 subject 看做是目标对象,也就是观察者的观察对象
  • 观察者也把 subject 作为一个属性
  • subject 中的某个行为会触发观察者的某些行为
  • observer 设计成抽象类是为了扩展,可以产生很多不同的观察者,都观察这个 subject

类图

在这里插入图片描述

案例代码

  • subject 是一个厨师
  • obeserver 分两种:端茶 observer 和 上菜 observer
  • 每次厨师做好一个菜,端茶的就去端茶,上菜的就去上菜

在这里插入图片描述

package 设计模式.观察者模式;

public abstract class Observer {
    protected String name;
    protected Subject subject;

    public Observer(String name, Subject subject){
        this.subject = subject;
        this.name = name;
    }

    public abstract void delivery();
    public abstract void makeTea();
}

package 设计模式.观察者模式;

public class ObserverNoodles extends Observer {

    public ObserverNoodles(String name, Subject subject) {
        super(name, subject);
    }

    @Override
    public void delivery() {
        System.out.println(name + " delicious food is delivering");
    }

    @Override
    public void makeTea() {

    }
}

package 设计模式.观察者模式;

public class ObserverTeaMaker extends Observer {
    public ObserverTeaMaker(String name, Subject subject) {
        super(name, subject);
    }

    @Override
    public void delivery() {

    }

    @Override
    public void makeTea() {
        System.out.println(this.name +  " is making tea for client");
    }
}

package 设计模式.观察者模式;

import javafx.beans.binding.ObjectExpression;

import java.util.ArrayList;

public class Subject {
    private String name="chef";
    private ArrayList<Observer> observers = new ArrayList<>();

    public Subject(){
        observers.add(new ObserverNoodles("noodleDeliver",this));
        observers.add(new ObserverTeaMaker("teaMaker",this));
    }

    public void cook(){
        System.out.println("chef is making delicious food!!");
        noticeAllObserver();
    }

    public void noticeAllObserver(){
        for (Observer obs :
                observers) {
            if (obs instanceof ObserverNoodles) {
                obs.delivery();
            }
            else {
                obs.makeTea();
            }
        }

    }
}

package 设计模式.观察者模式;

public class Demo {
    public static void main(String[] args) {
        Subject chef = new Subject();
        chef.cook();
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值