Java设计模式——观察者模式

概述

观察者模式是把两个对象分为被观察者与观察者,它们是一对多的关系,当被观察者状态改变时,所有的观察者都能收到通知。类似于微信公众号,可以把文章推送到关注了这个公众号的用户。

举例

在Java Swing中,如JButton的监听器,button.addListenner(new XXXListenner());单击、双击、长按监听器…

类图

这里写图片描述

Official:公众号接口(被观察对象)
User:用户接口(观察者)
设计时可以在UserImpl里面关联上Official,这样的话就可以在创建 UserImpl的时候直接关联上“被观察者”,

Official official = new Official();
UserImpl a = new UserImpl(official); //直接绑定,我下面的代码没有这样做

代码

//公众号接口
public interface Official {
    public void addUser(User user);
    public void remove(User user);
    public void push();
}
//用户接口
public interface User {
    public void receive(String news,String book,String paper);
    public void display();
}
//公众号实例
public class OfficialImpl implements Official {
    List<User> list; //公众号与用户是一对多关系,

    private String news;
    private String book;
    private String paper;

    public OfficialImpl() {
        list = new ArrayList<>();
    }

    @Override
    public void addUser(User user) {
        list.add(user);
    }

    @Override
    public void remove(User user) {
        list.remove(user);
    }

    @Override
    public void push() {
        for(User user : list) {
            user.receive(news, book, paper);
        }
    }

    public void setNews(String news) {
        this.news = news;
    }

    public void setBook(String book) {
        this.book = book;
    }

    public void setPaper(String paper) {
        this.paper = paper;
    }
}
//用户实例
public class UserImpl1 implements User {

    private String name;
    private String news;
    private String book;
    private String paper;

    public UserImpl1(String name) {
        this.name = name;
    }

    @Override
    public void receive(String news, String book, String paper) {
        this.news = news;
        this.book = book;
        this.paper = paper;
        display();
    }

    @Override
    public void display() {
        System.out.println(name + ":" + news + "|"+ book + "|" + paper);
    }
}
//main方法
public static void main(String[] args) {
    //公众号实例
    OfficialImpl official = new OfficialImpl();

    //添加n个用户
    official.addUser(new UserImpl1("小明"));
    official.addUser(new UserImpl1("小红"));
    official.addUser(new UserImpl1("小新"));

    //UserImpl2类我没写,代码和UserImpl1差不多只需实现User接口

    official.setNews("外星人来袭");
    official.setBook("<<故事会>>");
    official.setPaper("论减肥重要性");
    official.push();
}

输出结果:

这里写图片描述

总结

观察者模式是面向接口编程,动态增加新的“观察者”,以后需要UserImpl3、UserImpl4…时,只需要实现User接口,覆写接口的公用方法就可以直接使用。另外,可以在“被观察者”中加入get方法,用户可以“单独”获得最新状态。

Java 有内置工具,Observable抽象类(被观察者)和Observer接口(观察者),开发者可以直接实现来使用观察者模式更省事,有 需要的可以去了解下

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值