首页 > Java > java教程 > 正文

观察者模式

Patricia Arquette
发布: 2024-11-03 23:41:31
原创
337 人浏览过

什么是观察者模式?

观察者模式是一种行为模式,它定义了对象之间的一对多依赖关系,以便当一个对象更改状态时,它的所有依赖项都会收到通知并自动更新。

对象改变状态称为Subject,其依赖者称为Observers

什么时候使用它?

当您需要对象之间存在一对多依赖关系时,可以使用观察者模式,其中一个对象会更改其状态,并且许多依赖对象需要跟踪这些更改。

假设我们使用像X(Twitter)这样的SNS,公司和人们都有自己的帐户,人们可以关注他们最喜欢的公司,以便在公司发布有关新商品或促销商品时收到通知。在这种情况下,观察者模式就适用。

UML图

Observer Pattern

UML 图示例

Observer Pattern

  • 当调用setSaleItem方法时,即状态发生改变时,我们调用setItemChanged方法。然后,setItemChanged方法调用notifyAccount方法。
  • Company 类中的notifyAccount 方法迭代每个关注者并使用其自己的Company 对象调用更新方法,例如follower.update(this)

Java 中的实现

I公司界面:

public interface ICompany {

    void registerAccount(IAccount account);

    void removeAccount(IAccount account);

    void notifyAccounts();
}
登录后复制

公司类别:

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

public class Company implements ICompany {

    private List<IAccount> followers;

    private String name;

    private String saleItem;

    public Company(String name) {
        followers = new ArrayList<>();
        this.name = name;
    }

    @Override
    public void registerAccount(IAccount account) {
        this.followers.add(account);
    }

    @Override
    public void removeAccount(IAccount account) {
        this.followers.remove(account);
    }

    @Override
    public void notifyAccounts() {
        for (IAccount follower : followers) {
            follower.update(this);
        }
    }

    public String getName() {
        return name;
    }

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

    public String getSaleItem() {
        return saleItem;
    }

    public void setSaleItem(String saleItem) {
        this.saleItem = saleItem;
        saleItemChanged();
    }

    public void saleItemChanged() {
        notifyAccounts();
    }
}
登录后复制

IAaccount接口:

public interface IAccount {

    void update(Company company);
}
登录后复制

账户类别:

public class Account implements IAccount {

    private String name;

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

    @Override
    public void update(Company company) {
        System.out.println(this.name + " receives a new message from " + company.getName());
        System.out.println("New sale item: " + company.getSaleItem());
    }
}
登录后复制

客户端类:

public class Client {

    public static void main(String[] args) {
        Company apple = new Company("Apple"); // concrete subject

        IAccount john = new Account("John");
        IAccount david = new Account("David");

        // John starts following Apple Inc.
        apple.registerAccount(john);
        apple.setSaleItem("iPhone 14");
        System.out.println("**********************");

        // David becomes a new follower to Apple Inc.
        apple.registerAccount(david);
        apple.setSaleItem("iPad");
        System.out.println("**********************");

        // John doesn't receive message from Apple Inc. as he deregistered for Apple Inc.
        apple.removeAccount(john);
        apple.setSaleItem("AirPods");
    }
}
登录后复制

输出:

John receives a new message from Apple
New sale item: iPhone 14
**********************
John receives a new message from Apple
New sale item: iPad
David receives a new message from Apple
New sale item: iPad
**********************
David receives a new message from Apple
New sale item: AirPods
登录后复制

您可以在这里查看所有设计模式的实现。
GitHub 存储库


附注
我是刚开始写科技博客,如果您对我的写作有什么建议,或者有任何困惑的地方,请留言!
感谢您的阅读:)

以上是观察者模式的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板