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