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

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

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

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

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

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

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

观察者模式实践

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

两个接口

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 + ": 带着q前去零元购");
    }
}

进行单元测试

	
    @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();
    }

输出结果:

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

代码地址: giee

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5611798.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存