大雄,你好坏哦。我好喜欢(学习观察者模式)

本文通过一个生动的故事介绍了观察者模式,揭示了这种行为型模式的实质。文章首先定义了观察者模式,然后通过静香、大雄和胖虎的角色来阐述这种模式,创建了BeautifulGirl接口和Satyr痴汉接口,接着展示了静香、大雄、胖虎类的实现,最后进行了测试并总结了观察者模式的优点和缺点。

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

先上图
在这里插入图片描述

什么是观察者模式

观察者模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象,同时监听某一个主题对象。这个主题对象状态发生改变的时候,会通知所有得观察者对象,使得它们可以自动更新自己。

上面的定义是抽象的,对于很多同学而言第一次看到这种很官方的定义都感觉有点蒙蔽。当然咱们今天的这篇文章就是将抽象的定义用实实在在的代码将其实现,里面穿插着一些小故事。

进入故事

先来看看我们故事的主人公吧。

1.静香 (美女)
2.大雄 (痴汉)
3.胖虎 (痴汉)

众所周知,痴汉和美女之间的关系,不就是那种咳咳~~关系吗?你说对吧,痴汉总是一直偷偷观察着美女对吧,每当美女要去洗个澡啥的,痴汉们总是不约而至。咦,仔细想想这不就是咱们的观察模式吗?每当美女的状态改变, 她的观察者们就可以做出一些反应的动作

好嘞,上面的分析很符合今天要讨论的观察者设计模式。那么话不多说,看看代码怎么实现痴汉和美女之间的爱恨纠缠吧。

BeautifulGirl(接口)
package com.zxy.basic;

/**
 * @program: basic
 * @author: Josiah
 * @create: 2020-04-03 11:55
 **/
public interface BeautifulGirl {



    /**
     * 注册观察者
     * @param observer
     */
    void addObserver(Satyr observer);

    /**
     *  移除观察者
     * @param observer
     */
    void removerObserver(Satyr observer);

    /**
     *  通知所有得观察者
     */
    void notifyObservers();
}

Satyr (痴汉接口 )
package com.zxy.basic;

/**
 * @program: basic
 * @author: Josiah
 * @create: 2020-04-03 11:50
 **/
public interface Satyr {
    /**
     *  搞事情
     * @param msg
     */
    void update(String msg);

}

上面已经定义了美女和痴汉的接口,那么总有具体的美女和痴汉们吧。那么下面就是咱们的胖虎,大雄,静香登上舞台。

静香类
    package com.zxy.basic;

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

/**
 * @program: basic
 * @author: Josiah
 * @create: 2020-04-03 12:00
 **/
public class JingXiang implements BeautifulGirl {
    //偷偷关注静香的痴汉们
    private final List<Satyr> satyrList = new ArrayList<>();

    private String msg;
    
    @Override
    public void addObserver(Satyr observer) {
        satyrList.add(observer);
    }

    @Override
    public void removerObserver(Satyr observer) {
        int index  = satyrList.indexOf(observer);
        if(index>=0){
            satyrList.remove(index);
        }
    }

    @Override
    public void notifyObservers() {
        for (Satyr satyr : satyrList) {
            satyr.update(msg);
        }
    }

    /**
     * 静香得一举一动,都会不胫而走
     * @param msg
     */
    public void life(String msg){
        this.msg = msg;
        notifyObservers();
    }
}
大雄类
package com.zxy.basic;

/**
 * 大雄
 * @program: basic
 * @author: Josiah
 * @create: 2020-04-03 12:07
 **/
public class DaXiong implements Satyr {

    private BeautifulGirl beautifulGirl;

    public DaXiong(BeautifulGirl beautifulGirl) {
        this.beautifulGirl = beautifulGirl;
        //大雄偷偷得关注了静香
        beautifulGirl.addObserver(this);
    }

    @Override
    public void update(String msg) {
        if(msg.equals("TakeShower")){
            System.out.println("DaXiong:哇,有点上头了。。我要去偷看!");
        }else if(msg.equals("Study")){
            System.out.println("DaXiong:太困了,睡觉去吧..");
        }
    }
}
胖虎类
package com.zxy.basic;

/**
 * 胖虎
 * @program: basic
 * @author: Josiah
 * @create: 2020-04-03 12:07
 **/
public class PangHu implements Satyr {


    private BeautifulGirl beautifulGirl;

    public PangHu(BeautifulGirl beautifulGirl) {
        this.beautifulGirl = beautifulGirl;
        //胖虎偷偷得关注了静香
        beautifulGirl.addObserver(this);
    }

    @Override
    public void update(String msg) {
        if(msg.equals("TakeShower")){
            System.out.println("Panghu:我可是堂堂虎大将军,岂能有非分之想?");
        }else if(msg.equals("Study")){
            System.out.println("Panghu:I love Study");
        }
    }
}

那么接下来就是看看静香的一举一动被大雄和胖虎监控着吗?再看看大雄和胖虎的各种反应吧!

测试类
package com.zxy.basic.lambda;
import com.zxy.basic.DaXiong;
import com.zxy.basic.JingXiang;
import com.zxy.basic.PangHu;
import java.io.IOException;
/**
 * @program: basic
 * @author: Josiah
 * @create: 2020-04-03 12:12
 **/
public class ObserverTest {

    public static void main(String[] args) throws IOException {
        JingXiang jingXiang = new JingXiang();
        PangHu pangHu = new PangHu(jingXiang);
        DaXiong daXiong = new DaXiong(jingXiang);
        jingXiang.life("TakeShower");
        jingXiang.life("Study");
        System.out.println("=================");
        //静香发现了大雄偷窥她,将他删除掉
        jingXiang.removerObserver(daXiong);
        jingXiang.life("TakeShower");
        jingXiang.life("Study");
    }
}

运行结果:
在这里插入图片描述

总结

观察者模式的主要解决的问题是:一个对象状态再改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

优点: 1.观察者和被观察者是抽象耦合的。2.建立了一套触发机制。
缺点: 1.如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

最后再看看结构图:
在这里插入图片描述

内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值