「デザインモデル」オブザーバーモード

Observerパターン

オブジェクトの状態が変化したとき、その扶養家族のすべてが通知され、自動的に更新されるように、オブザーバーモデルは、多くのオブジェクト間の依存関係を定義します

二つの役割、1人のオブザーバーでオブザーバーパターン、第二は、観察(テーマ)で、それはまた、加入者と出版社とみなすことができます。

受信した通知オブザーバー。

観測者と観測された単語が混同されている場合は、カバーするために新聞の購読を公開することができます。お客様は、お客様が観察者があるので、それは新聞のオブザーバーになることです、新聞、新聞所得者(収入通知)に加入します。

使用

/**
 * 抽象类
 * @author aodeng-低调小熊猫
 * @since 19-7-15
 */
public abstract class Customer {
    /**
    * <p>
    * 定义一个抽象方法
    * </p>
    * @author aodeng
    * @since 19-7-15
    */
    public abstract void update();

}复制代码

/**
 * 收到通知的观察者客户A
 * @author aodeng-低调小熊猫
 * @since 19-7-15
 */
public class CustomerA extends Customer {
    @Override
    public void update() {
        System.out.println("我是客户A,我收到报纸了!");
    }
}复制代码

/**
 * 收到通知的观察者客户B
 * @author aodeng-低调小熊猫
 * @since 19-7-15
 */
public class CustomerB extends Customer {
    @Override
    public void update() {
        System.out.println("我是客户B,我收到报纸了");
    }
}复制代码

/**
 * 被观察者 报社
 * @author aodeng-低调小熊猫
 * @since 19-7-15
 */
public class NewsOffice {
    private List<Customer> customerList=new ArrayList<>();

    public void add(Customer customer){
        this.customerList.add(customer);
    }

    /** 
    * <p>
    * 模拟新报纸来了
    * </p> 
    * @author aodeng
    * @since 19-7-15
    */
    public void newspaperCome(){
        this.notifyAllObservers();
    }

    public void notifyAllObservers(){
        for (Customer customer : customerList) {
            customer.update();
        }
    }
}复制代码

テスト

    public static void main(String[] args) {
        System.out.println("Hello World!");
        NewsOffice newsOffice=new NewsOffice();
        newsOffice.add(new CustomerA());
        newsOffice.add(new CustomerB());
        newsOffice.newspaperCome();

    }
    输出:
    Hello World!
    我是客户A,我收到报纸了!
    我是客户B,我收到报纸了复制代码

強めます

/**
 * 定义被观察者接口
 * @author aodeng-低调小熊猫
 * @since 19-7-15
 */
public interface ISubject {
    public void registerObserver(Customer customer);
    public void removeObserver(Customer customer);
    public void notifyObservers();

}复制代码
/**被观察者 报社 加强版
 * @author aodeng-低调小熊猫
 * @since 19-7-15
 */
public class NewsOfficeNiu implements ISubject {

    private List<Customer> customerList = new ArrayList<>();

    @Override
    public void registerObserver(Customer customer) {
        this.customerList.add(customer);
    }

    @Override
    public void removeObserver(Customer customer) {
        customerList.remove(customer);
    }

    @Override
    public void notifyObservers() {
        for (Customer customer : customerList) {
            customer.update();
        }
    }

    //模拟报纸来了
    public void newspaperCome(){
        this.notifyObservers();
    }
}复制代码

テスト

        System.out.println("加强版========");
        ISubject iSubject=new NewsOfficeNiu();
        Customer customera=new CustomerA();
        iSubject.registerObserver(customera);
        iSubject.removeObserver(customera);
        iSubject.registerObserver(new CustomerB());
        ((NewsOfficeNiu) iSubject).newspaperCome();
        
       输出:
       加强版========
       我是客户B,我收到报纸了复制代码

Javaはオブザーバ・モードを提供します

Javaは、我々はカテゴリを必要とObserverパターンに提供されています:Observerクラスと件名クラスが、Javaで件名件名を呼び出すことはありませんし、観察可能と呼ばれます。

デモをコピーします

//demo
public class NewsOffice2 extends Observable {

    /**
     * 模拟报纸来了
     */
    public void newspaperCome(){
        this.setChanged();
        this.notifyObservers();
    }
}
public class CustomerC implements Observer {

    @Override
    public void update(Observable o, Object arg) {
        System.out.println("我是客户C,我收到消息啦");
    }
}

//测试
Observableoffice = new NewsOffice2();
Observer observer = new CustomerC();

office.addObserver(observer);

((NewsOffice2) office).newspaperCome();复制代码

概要

対価のJavaスレッドセーフになるが、多くの都合の良い時間、長所と短所を書くために

観測者と観測の間に1利点抽象カップリングは、限り、あなたは、ビューアのインターフェイスを満たすことができるように、ということに気づく人知らずにトリガ機構のセット、観測されたオブジェクトを持っています。

2.観察者の唯一の欠点は、観測者の変化を認識し、変更が発生したのか分からないことができ、例えば、名前フィールドまたは他のを修正するために、オブザーバーは知りません。あなたが視聴者の多くを持っている場合は、1つの通知時間のかかります。

ソース

ソースアドレスします。https://github.com/java-aodeng/hope

リンク:

本論文では、公表され、低キー、複数のオペレーティング・パンダの記事で構成されて!いいえ歓迎世間の注目ません:低キー赤パンダ

おすすめ

転載: juejin.im/post/5dbbf34b51882522e83f4bbf