publish - Subscribe
3081 ワード
一例導入オブザーバインタフェース 購読者インタフェース アナウンサー(パブリッシャインタフェースの実装) 購読視聴者(観察者のインタフェースを実現する) test
なぜ観察者モードを使うのか、観察者モードでシーンを適用するのか抽象モデルに2つの態様がある場合、一方の態様の動作は他方の態様の状態変化 に依存する.オブジェクトを変更する場合、同時に他のオブジェクトを変更する必要があり、どのくらいのオブジェクトが連帯変更されるべきか分からない .オブジェクトが他のオブジェクトに通知する必要がある場合、このオブジェクトと他のオブジェクトがばらばら結合 であることを望んでいます.
package subpub.interface_;
public interface Observer {
public void update(Subscribe sub);
public boolean isInterested();
}
package subpub.interface_;
import java.util.ArrayList;
import java.util.List;
public interface Subscribe {
List observers = new ArrayList<>();
public void append(Observer observer);
public void remove(Observer observer);
public void myNotify();
}
package subpub.interface_;
public class Anchor implements Subscribe{
private String anName;
public boolean isOnline() {
return online;
}
public void setOnline() {
this.online = true;
myNotify();
}
private boolean online;
public Anchor(String anName,boolean online) {
this.anName = anName;
this.online = online;
}
public String getAnName() {
return anName;
}
public void setAnName(String anName) {
this.anName = anName;
}
@Override
public void append(Observer observer){
observers.add(observer);
}
@Override
public void remove(Observer observer){
observers.remove(observer);
}
@Override
public void myNotify() {
for (Observer observer:observers) {
if(observer.isInterested()){
observer.update(this);
}
}
}
}
package subpub.interface_;
/**
* Created by liqiushi on 2017/11/22.
*/
public class Audience implements Observer {
private String auName;
Subscribe sub ;
private boolean interested;
public void setInterested(boolean interested) {
this.interested = interested;
}
public Audience(String auName,Subscribe sub) {
this.auName = auName;
this.sub =sub;
sub.append(this);
}
@Override
public void update(Subscribe sub) {
System.out.println(" " + this.auName + ":" + ((Anchor) sub).getAnName() + " !");
}
@Override
public boolean isInterested() {
return interested;
}
}
package subpub;
import subpub.interface_.Anchor;
import subpub.interface_.Audience;
import subpub.interface_.Observer;
import subpub.interface_.Subscribe;
public class TestMain {
public static void main(String[] args) {
Subscribe subscribe = new Anchor(" ",false);
Observer childAu = new Audience(" ",subscribe);
Observer womanAu = new Audience(" ",subscribe);
((Audience)childAu).setInterested(true);
((Anchor)subscribe).setOnline();
}
}
// : !
なぜ観察者モードを使うのか、観察者モードでシーンを適用するのか