Java设计模式-观察者模式

博客围绕古铁工厂订阅展开,背景是欧洲、亚洲、美洲联邦军大批采购古铁并订阅工厂消息,欧洲联邦军因古铁不适用于高强度战役停止订阅。实现部分涉及工厂订阅者接口、组织观察者接口等,还进行了测试,最后总结表示未完待续。

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

背景

联邦军在各个地区都有驻军。最近欧洲、亚洲、美洲联邦军大批采购了古铁,并希望能够随时收到古铁工厂的消息(优惠通知、到货通知等)。后来,欧洲联邦军在使用古铁作战时,发现古铁并不适用于欧洲高强度的战役,故欧洲联邦军第一时间停止了对古铁工厂的订阅,也收不到古铁工厂发来的消息。我们来看下具体是什么情况?

实现

工厂订阅者接口

/**
 * 工厂订阅者抽象类
 */
public interface FactorySubject {
    
    /**
     * 注册观察者
     */
    void registObserver(OrgObserver o);
    
    /**
     * 移除观察者
     */
    void removeObserver(OrgObserver o);
    
    /**
     * 通知观察者
     */
    void notifyObserver();
}

组织观察者接口

/**
 * 组织观察者,比如亚洲联邦军、美洲联邦军都是组织,观察来自工厂的通知
 */
public interface OrgObserver {

    /**
     * 显示通知
     */
    void showNotify(String notice);
    
}

亚洲联邦军

public class AsianOrg implements OrgObserver {

    @Override
    public void showNotify(String notice) {
        System.out.println("亚洲联邦军你们好!这是最新的消息:" + notice);
    }

}

欧洲联邦军

public class EuropeOrg implements OrgObserver {

    @Override
    public void showNotify(String notice) {
        System.out.println("欧洲联邦军你们好!这是最新的消息:" + notice);
    }

}

美洲联邦军

public class AmericaOrg implements OrgObserver {

    @Override
    public void showNotify(String notice) {
        System.out.println("美洲联邦军你们好!这是最新的消息:" + notice);
    }

}

古铁工厂

/**
 * 古铁工厂
 */
public class AncientIronFactory implements FactorySubject {
    
    private List<OrgObserver> observers = new ArrayList<>();
    
    private String notice;

    @Override
    public void registObserver(OrgObserver o) {
        observers.add(o);
    }

    @Override
    public void removeObserver(OrgObserver o) {
        if (observers.indexOf(o) != -1) {
            observers.remove(o);
        }
    }

    @Override
    public void notifyObserver() {
        for (OrgObserver observer : observers) {
            observer.showNotify(notice);
        }
    }

    public String getNotice() {
        return notice;
    }

    public void setNotice(String notice) {
        this.notice = notice;
        notifyObserver();
    }
    
}

测试

public class Test {

    public static void main(String[] args) {
        AsianOrg asianOrg = new AsianOrg();
        EuropeOrg europeOrg = new EuropeOrg();
        AmericaOrg americaOrg = new AmericaOrg();
        
        AncientIronFactory factory = new AncientIronFactory();
        // 三个联邦军组织在我这里订阅了古铁工厂的讯息
        factory.registObserver(asianOrg);
        factory.registObserver(europeOrg);
        factory.registObserver(americaOrg);
        // 最近古铁备货充足,通知下他们。
        factory.setNotice("你们好,这是来自古铁工厂的通知,最近古铁备货充足,欢迎进购,祝生活愉快!");
        System.out.println("---------------------------");
        
        // 欧洲联邦军觉得古铁不适合欧洲战区,所以取消了古铁工厂的订阅
        factory.removeObserver(europeOrg);
        // 由于失去了一大客户,古铁工厂损失巨大,不得不将古铁的价格上调
        factory.setNotice("你们好,这是来自古铁工厂的通知,由于最近物料匮乏,古铁的价格会上涨,但不会太多,请互相理解,谢谢!");
    }
    
}

测试结果

亚洲联邦军你们好!这是最新的消息:你们好,这是来自古铁工厂的通知,最近古铁备货充足,欢迎进购,祝生活愉快!
欧洲联邦军你们好!这是最新的消息:你们好,这是来自古铁工厂的通知,最近古铁备货充足,欢迎进购,祝生活愉快!
美洲联邦军你们好!这是最新的消息:你们好,这是来自古铁工厂的通知,最近古铁备货充足,欢迎进购,祝生活愉快!
---------------------------
亚洲联邦军你们好!这是最新的消息:你们好,这是来自古铁工厂的通知,由于最近物料匮乏,古铁的价格会上涨,但不会太多,请互相理解,谢谢!
美洲联邦军你们好!这是最新的消息:你们好,这是来自古铁工厂的通知,由于最近物料匮乏,古铁的价格会上涨,但不会太多,请互相理解,谢谢!
总结

未完待续.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值