案例分析:设计模式与代码的结构特性

Posted hallowode

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了案例分析:设计模式与代码的结构特性相关的知识,希望对你有一定的参考价值。

观察者模式

观察者模式(又称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系。能够实现让多个观察者监听某一个对象的动态。当这个对象发布新动态的时候,会通知所有已订阅的观察者。观察者根据自己的行为来处理该通知。

应用场景

在我们生活中处处存在着观察者模式(或者称为发布-订阅模式),例如:10086给移动用户发送短信、微信群聊发送消息给全体人员、微博粉丝接收明星发送的动态等。所有一对多的关系基本都可以转化为观察者模式。

那么订阅者模式有什么好处呢?

想想,这两种情况:

  • 1、你的偶像在微博发布动态,微博会自动通知你来看。
  • 2、你自己每隔1分钟登录微博查看你的偶像发动态没。

在以上两种选择下,你为了能及时看到你的偶像发布的动态并抢个评论区沙发,你会选择哪种方案呢?是的,第一种方案就属于我们的观察者模式,它是基于事件驱动。一旦偶像发布动态这个事件发生,系统就会自动通知该偶像的观察者(也就是你)。而方案二虽然也能及时的看到偶像的动态,但是会浪费你大量时间,如果计算机来做这种事,则会占用大量时间进行CPU计算。

模式中的角色

说了那么多,来看下订阅者模式的有关的角色吧。

  • 抽象主题(Subject):定义了一个主题的基本方法,其中最重要的是一个观察者订阅方法。
  • 抽象观察者(Observer):定义了观察者的基本方法,其中最重要的方法是update方法,主题发布通知后,会通知观察者调用update方法处理。

技术图片

代码示例

下面我们用微博偶像发布动态通知用户的案例来分析观察者模式

抽象主题

偶像(主题)通过实现该接口,来成为一个消息发布者。

  • fans属性:是一个List类型变量,它用来存放粉丝(观察者)的信息。
  • addFans方法:用于粉丝(观察者)订阅偶像(subject)。
  • sendMsg方法:是偶像(主题)发布信息,在这里面偶像(主题)根据自己的需求通知用户(我们这里是通知所有用户,但也可以根据业务需求通知某一类型的用户)。
public interface Subject {

    List<Observe> fans = new ArrayList<>();

    void addFans(Observe fan);

    void sendMsg(String msg);

}

具体的主题(偶像)

  • sendMsg方法:运用了java面向对象的多态机制。即使是不同的类,但只要它是Observe的子类,运行sendMsg方法后,它们都会根据自己实现的notify做出不同的响应。
public class Idol implements Subject {

    @Override
    public void addFans(Observe fan) {
        this.fans.add(fan);
    }

    public void sendMsg(String msg) {
        for (Observe fan : this.fans) fan.notify(msg);
    }
}

抽象观察者

粉丝类通过实现该接口来实现消息观察者

  • notify方法:消息发布者发布新动态后,会调用notify,从而实现偶像(主题)发布消息及时通知fans(观察者)的效果。
public interface Observe {

    void notify(String msg);

}

具体的观察者(普通用户)

public class User implements Observe {

    private String username;

    public User(String username) {
        this.username = username;
    }

    @Override
    public void notify(String msg) {
        System.out.println(username + ":快看Idol发布动态了");
    }
}

main方法

public static void main(String[] args) {
    Idol zhouJieLun = new Idol();

    User a = new User("用户A");
    User b = new User("用户B");
    User c = new User("用户C");
    User d = new User("用户D");

    zhouJieLun.addFans(a);
    zhouJieLun.addFans(b);
    zhouJieLun.addFans(c);
    zhouJieLun.addFans(d);

    zhouJieLun.sendMsg("新专辑《说好不哭》");
}

运行结果

可以看到不同的用户对周杰伦发布消息后及时的做出了不同的反应。而且粉丝们也没有不停的去查询偶像有没有发布动态,而是通过偶像来通知粉丝们来看新动态。

技术图片

以上是关于案例分析:设计模式与代码的结构特性的主要内容,如果未能解决你的问题,请参考以下文章

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性