栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java设计模式 第二章:观察者模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java设计模式 第二章:观察者模式

观察者模式

一方发生改变时通知多放进行相应的操作

比如:
商人进货了,通知村民商品进货
微信公众号发文章了,通知所有关注者最新的消息

为什么使用观察者模式
  1. 降低代码耦合度
  2. 增强扩展性

我认为设计模式是死的但是业务是灵活的,我们需要根据业务灵活使用设计模式,心中无模式代码有模式

观察者模式实践

实现业务:
良民: 张三 李四 劫匪: 张麻子 观察卖大米商人的信息
张三 李四 监听到大米进货前去买大米
张麻子 监听到大米进货带着枪前去零元购

两个接口

public interface IObserver {

    
    void setName(String name);

    
    void receive(String name, String msg);
}

public interface ISubject {

    
    void setName(String name);

    
    void addObserver(IObserver observer);

    
    void notifyAllObservers(String msg);
}

三个实现类


public class Merchant implements ISubject {

    List observerList = new ArrayList<>();

    private String name;

    @Override
    public void setName(String name) {
       this.name = name;
    }

    @Override
    public void addObserver(IObserver observer) {
        observerList.add(observer);
    }

    public void addGoods(){
        this.notifyAllObservers("大米进货了");
    }

    @Override
    public void notifyAllObservers(String msg) {
        for (IObserver iObserver : observerList) {
            iObserver.receive(name,msg);
        }

    }
}
public class People implements IObserver {

    
    private String peopleName;

    @Override
    public void setName(String name) {
      this.peopleName = name;
    }

    public void setObsName(String obsName) {
        this.peopleName = obsName;
    }

    @Override
    public void receive(String name, String msg) {
        // 接收到通知
        System.out.println("良民: " + this.peopleName + "接收到" + name + "的消息: " + msg);
        // 张三行动
        System.out.println(this.peopleName + ": 带钱去买大米");
    }
}

public class Robber implements IObserver {

    
    private String robberName;

    @Override
    public void setName(String name) {
        this.robberName = name;
    }

    @Override
    public void receive(String name, String msg) {
        // 接收到通知
        System.out.println("劫匪: " + this.robberName + "接收到" + name + "的消息: " + msg);
        // 张三行动
        System.out.println(this.robberName + ": 带着枪前去零元购");
    }
}

进行单元测试

	
    @Test
    public void test1() {

        Merchant m = new Merchant();
        m.setName("卖大米的");

        IObserver zhangSan = new People();
        zhangSan.setName("张三");
        m.addObserver(zhangSan);
        IObserver liSi = new People();
        liSi.setName("李四");
        m.addObserver(liSi);

        IObserver maZi = new Robber();
        maZi.setName("张麻子");
        m.addObserver(maZi);

        m.addGoods();
    }

输出结果:

良民: 张三接收到卖大米的的消息: 大米进货了
张三: 带钱去买大米
良民: 李四接收到卖大米的的消息: 大米进货了
李四: 带钱去买大米
劫匪: 张麻子接收到卖大米的的消息: 大米进货了
张麻子: 带着枪前去零元购

代码地址: giee

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/605654.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号