2017-11-01 5 views
0

私は実際に質問のためにあなたの助けが必要です:パターンオブザーバーの正しい実装。実際のところ、私は正しいことを保証していないので、UMLと下のコードの間に矛盾があるかどうかを知りたいのですが、両者の最小の間違い/改善可能な詳細を報告してください。私は誰にでも感謝するでしょう、事前に感謝します。Observer Uml&Java

UML:

Observer UML

Javaコードは:

public interface Subject { 
    public void registerObserver(Observer o); 
    public void removeObserver(Observer o); 
    public void notifyObservers(); 
} 

public class ConcreteSubject implements Subject { 
    private int my_state; 
    private ArrayList<Observer> observers; 
    public ConcreteSubject(){ 
     observers=new ArrayList<Observer>(); 
    } 
    public void registerObserver(Observer o){ 
     observers.add(o); 
    } 
    public void removeObserver(Observer o){ 
     observers.remove(o); 
    } 
    public void notifyObservers(){ 
     for(Observer o : observers) 
      o.update(); 
    } 
    //PULL Mode -> Observer musts grab the state of the subject 
    public int getState(){ 
     return my_state; 
    } 
    public void setState(int state){ 
     my_state=state; 
    } 
} 

public interface Observer { 
    public void update(); //In PULL mode update don't need the state of the subject in argument 
} 

public class ConcreteObserver implements Observer { 
    private ConcreteSubject my_subject; 
    public ConcreteObserver(ConcreteSubject subject){ 
     my_subject=subject; 
    } 
    public void update(){ 
     System.out.println("The state is: "+my_subject.getState()); 
    } 
} 
+0

https://en.wikipedia.org/wiki/Observer_pattern –

答えて

0

あなたが考えることができますので、件名として抽象クラスを実装するためのConcreteSubjectは、変更についてのみ気になります状態の通知とtの通知彼はオブザーバーです。
このアプローチでは、より多くのことができます。ConcreteSubjects
Observer patternの例を確認してください。

+0

返信いただきありがとうございます。あなたのアイデアはもちろん良いですが、このようにしてConcreteSubjectsは他のものを拡張することができませんでした。私はJavaでその種のダイアグラムを実装したいと思いますし、矛盾があるかどうかを知りたいのですが。たとえば、インタフェースと具体的なクラスの間のカーディナリティは異なりますが、私はそれが正しいとは確信していません。さらに、具体的なクラスとサブジェクト属性との関連付けを、PULLモードで実行したいので、実装するのは正しいですか? (PUSHモードでは、更新呼び出しで状態を追加する必要がありますか?) – gipsy