观察者模式(Observer Pattern)案例解析

本文深入探讨了观察者模式(Observer Pattern),通过案例解析展示了如何建立对象间的一对多依赖关系,当对象状态改变时,所有相关依赖都会自动收到通知并进行相应更新。在文中,我们看到具体的应用场景,如导弹、大炮和雷达之间的交互,揭示了模式在实际问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

观察者模式(Observer Pattern)

定义:

定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。


类图:


案例描述:
有一个雷达负责扫描目标,一旦发现目标,就会通知攻击序列对目标进行摧毁,攻击序列中的所有武器会向目标发动攻击。
现有的武器可以加入攻击序列,也可以退出攻击序列。
雷达扮演Subject,大炮和导弹扮演Observer,大炮和导弹通过attach加入到雷达的攻击序列,一旦雷达发现目标,启动攻击序列摧毁目标。

案例源码:
/*
 * shsheng
 */
package DesignPatterns;

import java.util.ArrayList;
import java.util.List;

public class ObserverPattern {

    public static void main(String[] args) {
        Radar radar = new Radar();
        Missile missile = new Missile(1);
        Cannon cannon = new Cannon(1);

        radar.attach(missile);
        radar.attach(cannon);
        radar.find(new Fighter(1));

        radar.detach(cannon);
        radar.find(new Fighter(2));
    }

    static class Fighter {
        int num;

        public Fighter(int num) {
            this.num = num;
        }

        @Override
        public String toString() {
            return "战斗机" + num;
        }
    }

    static class Radar {
        List
   
   
    
     attacks = new ArrayList
    
    
     
     ();

        public void attach(Attack attack) {
            System.out.println(attack + "加入攻击序列!");
            attacks.add(attack);
        }

        public void detach(Attack attack) {
            System.out.println(attack + "退出攻击序列!");
            if (attacks.contains(attack)) {
                attacks.remove(attack);
            }
        }

        public void find(Object obj) {
            System.out.println("雷达发现" + obj + ",通知攻击!");
            for (Attack attack : attacks) {
                attack.attack(obj);
            }
        }
    }

    static interface Attack {
        public void attack(Object obj);
    }

    static class Missile implements Attack {
        int num;

        public Missile(int num) {
            this.num = num;
        }

        @Override
        public void attack(Object obj) {
            System.out.println("导弹锁定" + obj + ",准备发射!");
        }

        @Override
        public String toString() {
            return "导弹" + num;
        }
    }

    static class Cannon implements Attack {
        int num;

        public Cannon(int num) {
            this.num = num;
        }

        @Override
        public void attack(Object obj) {
            System.out.println("大炮瞄准" + obj + ",准备开炮!");
        }

        @Override
        public String toString() {
            return "大炮" + num;
        }
    }

}

    
    
   
   


运行结果:

导弹1加入攻击序列!
大炮1加入攻击序列!
雷达发现战斗机1,通知攻击!
导弹锁定战斗机1,准备发射!
大炮瞄准战斗机1,准备开炮!
大炮1退出攻击序列!
雷达发现战斗机2,通知攻击!
导弹锁定战斗机2,准备发射!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值