观察者模式的简单demo

一个简单的观察者模式demo

定义对象之间一对多的关系,当一个对象状态被更新时,所有依赖于它的对象都将被更新。观察者模式有四种定义角色,分别为:抽象主题(Subject)、具体主题(ConcreteSubject)、抽象观察者(Observer)、具体观察者(ConcreteObserver)。
这种模式可以理解为:抽象主题中定义具体主题需要包含的方法,具体主题继承抽象主题,并对抽象主题中的抽象方法给出具体实现,包括对观察者的注册、观察者的移除、通知观察者方法的具体实现。抽象观察者定义具体观察者中需要包含的状态更新抽象方法,具体观察者继承抽象观察者并给出抽象方法的具体实现。具体观察者实例化时由具体主题进行注册。当具体主题的状态发生变化时,具体主题中的通知观察者方法会给已经注册的具体观察者发出广播通知,对具体观察者的状态进行更新。
下面给出demo的实现代码。
抽象观察者:

public abstract class Observer {
    public abstract void update();
}

具体观察者1

public class BinaryObserver extends Observer{
    private Subject subject;
    public BinaryObserver(ConcreteSubject subject){
        this.subject=subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Binary string:"+Integer.toBinaryString(subject.getState()));
    }
}

具体观察者2

public class HexObserver extends Observer {
    private Subject subject;
    public HexObserver(ConcreteSubjectsubject){
        this.subject=subject;
        this.subject.attach(this);
    }
    @Override
    public void update() {
        System.out.println("Hex String:"+Integer.toHexString(subject.getState()));
    }
}

具体观察者3

public class OctalObserver extends Observer {
    private Subject subject;
    public OctalObserver(ConcreteSubject subject){
        this.subject=subject;
        this.subject.attach(this);
    }
    @Override
    public void update() {
        System.out.println("Ocatl String:"+Integer.toOctalString(subject.getState()));
    }
}

抽象主题

public abstract class Subject {
    /**
     * 增加观察者
     * @param observer
     */
    public abstract void attach(Observer observer);
    /**
     * 删除观察者
     * @param observer
     */
    public abstract void detach(Observer observer);
    /**
     * 通知观察者
     */
    public abstract void notifyObserver();
}

具体主题

public class ConcreteSubject extends Subject {
    private List<Observer> observers=new ArrayList<Observer>();
    private int state;
    public int getState(){
        return state;
    }
    public void setState(int state){
        this.state=state;
        notifyAllObservers();
    }
    @Override
    public void detach(Observer observer){
        observers.remove(observer);
}
    @Override
    public void attach(Observer observer){
        observers.add(observer);
    }
    @Override
    public void notifyObservers(){
        for (Observer observer:observers){
            observer.update();
        }
    }
}

测试Demo

public class Main {
    public static void main(String[] args){
        ConcreteSubject subject=new ConcreteSubject();
        new BinaryObserver(subject);
        new OctalObserver(subject);
        new HexObserver(subject);
        System.out.println("第一次更新:");
        subject.setState(15);
        System.out.println("第二次更新:");
        subject.setState(10);
    }
}

以上内容均为个人理解,如有错误之处,敬请批评指正!谢谢~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的!下面是一个简单的 Spring Boot 观察者模式的示例代码: 首先,我们需要定义一个被观察的主题类(Subject),可以是一个普通的 Java 类: ```java import java.util.ArrayList; import java.util.List; public class Subject { private List<Observer> observers = new ArrayList<>(); public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void notifyObservers(String message) { for (Observer observer : observers) { observer.update(message); } } } ``` 然后,定义观察者接口(Observer): ```java public interface Observer { void update(String message); } ``` 接下来,我们可以创建一些具体的观察者类来实现 Observer 接口: ```java public class ConcreteObserver implements Observer { @Override public void update(String message) { System.out.println("Received message: " + message); // 实现具体的观察者逻辑 } } ``` 最后,在 Spring Boot 应用中使用观察者模式: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ObserverPatternDemoApplication { public static void main(String[] args) { SpringApplication.run(ObserverPatternDemoApplication.class, args); // 创建被观察的主题对象 Subject subject = new Subject(); // 创建观察者对象 Observer observer1 = new ConcreteObserver(); Observer observer2 = new ConcreteObserver(); // 注册观察者 subject.attach(observer1); subject.attach(observer2); // 发送通知 subject.notifyObservers("Hello, observers!"); } } ``` 这个示例中,我们创建了一个被观察的主题对象(Subject),并注册了两个观察者对象(ConcreteObserver)。当主题对象调用 `notifyObservers` 方法时,观察者对象会接收到通知,并执行相应的逻辑。 希望这个示例能帮助到你!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值