2

私は現在オブザーバーパターンを研究していますが、混乱が生じています。

このコード行を読んだとき:

IObserverSubscribe user1= new ConcreteObserverYoutubeUser();

IObserverSubscribe user1インターフェイスはを作成してインスタンス化していると思いますnew ConcreteObserverYoutubeUser()。通常、宣言されているのと同じクラスもインスタンス化されているため、これは少し混乱します。次のようになります。

IObserverSubscribe user1= new IObserverSubscribe();

インターフェイス装飾が別のクラスをインスタンス化できるのはなぜですか?

以下の完全なコード:

主要:

package observerpattern;

public class ObserverPattern {

    /**
     * The observer pattern is a software design pattern in which
     *  an object, called the subject, maintains a list of its dependents,
     *  called observers, and notifies them automatically of any 
     *  state changes, usually by calling one of their methods.
     *  It is mainly used to implement distributed event handling systems.
     *  The Observer pattern is also a key part in the familiar
     *  Model View Controller (MVC) architectural pattern. 
     */
    public static void main(String[] args) {

        SubjectYouTubeChannel sytc= new SubjectYouTubeChannel();// create youtube channel
        IObserverSubscribe user1= new ConcreteObserverYoutubeUser();
        IObserverSubscribe user2= new ConcreteObserverYoutubeUser();
        IObserverSubscribe moderator1= new ConcreteObserverYoutubeModerator();

        sytc.Subscribe(user1);
        sytc.Subscribe(user2);
        sytc.Subscribe(moderator1);
        sytc.Unsubscribe(user2);

        sytc.notifySubscribers();


    }

}

主題:

package observerpattern;

import java.util.ArrayList;
import java.util.List;
import observerpattern.IObserverSubscribe;

public class SubjectYouTubeChannel {    
    private List<IObserverSubscribe> subscribers = new ArrayList<IObserverSubscribe>(); 
    public void Subscribe(IObserverSubscribe ios){
        subscribers.add(ios);       
    }   
    public void Unsubscribe(IObserverSubscribe ios){        
        subscribers.remove(ios);
    }   
    public void notifySubscribers(){        
        for(IObserverSubscribe ios : subscribers ){         
            ios.Notify();           
        }       
    }
}

インターフェイスオブザーバー:

package observerpattern;

public interface IObserverSubscribe {

    void Notify();

}

具体的なオブザーバー:

package observerpattern;

public class ConcreteObserverYoutubeUser implements IObserverSubscribe{

    @Override
    public void Notify() {
        System.out.println("User watches video, comments, ect");

    }

}
4

3 に答える 3

2
new IObserverSubscribe();

インターフェイスをインスタンス化できないため、これは違法です。定義上、メソッドの定義はありません。

IObserverSubscribe user1= new ConcreteObserverYoutubeUser();

ここでの左側は、それが少なくともuser1型であると言います。つまり、その型がインターフェースを実装するインスタンスを指します。 IObserverSubscribe

一方、右側は実際に具象型のインスタンスを作成し、に割り当てuser1ます。これが可能なのは、具象型がインターフェースを実装しているためです。

于 2012-12-27T15:12:23.613 に答える
1

IObserverSubscribe user1 = new ConcreteObserverYoutubeUser(); インターフェイスIObserverSubscribeuser1は、新しいConcreteObserverYoutubeUser()を作成してインスタンス化していると思います。通常、宣言されているのと同じクラスもインスタンス化されているため、これは少し混乱します。次のようになります。

IObserverSubscribe user1 = new IObserverSubscribe();

いいえ、インターフェイスをインスタンス化することはできません。

IObserverSubscribe user1= new ConcreteObserverYoutubeUser();

ConcreteObserverYoutubeUserこれにより、のサブクラス(または実装クラス)で あるインスタンスが作成されますIObserverSubscribe

于 2012-12-27T15:12:15.167 に答える
1

インターフェイスが何をするのか、オブザーバー パターンが何のために使用されるのかを考えてください。

ConcreteObserverYoutubeUser は IObserverSubscribe インターフェイスを実装します。これは、「Notify()」メソッドがあることを保証する必要があるためです。したがって、「IObserverSubscribers」であるはずのすべてのクラスは、通知を受けたときに特に何かを行う必要があります。

次のことができると、オブザーバー パターンの目的が無効になります。

 IObserverSubscribe user1= new IObserverSubscribe();

YouTube モデレーターと YouTube ユーザーは機能が異なるため、両方に同じ Notify メソッドを使用することはできません (以下の変更されたコードを参照してください)。

ユーザー クラス:

 package observerpattern;

 public class ConcreteObserverYoutubeUser implements IObserverSubscribe{ 

     @Override
     public void Notify() {
         sendEmail("A new video was added! It might be a cat video, so you should " +
       "probably view it, vote on it, comment on it, or ignore it.");

     }
     @Override
     public void watchVideo(Video v) {
       //...
     }
     @Override
     public void giggleAtCatVideo() {
         //..
     }


 }

司会者クラス:

 package observerpattern;

 public class ConcreteObserverYoutubeModerator implements IObserverSubscribe{    
     @Override
     public void Notify() {
         sendEmail("New video added, see if it should be deleted or if there is copyright infringement.");
     } 
     @Override
     public void deleteVideo(Video v) {
         //..
     }
 }

なぜそれが役立つのですか?「IObserverSubscribe」インターフェースを実装するオブジェクトを保持できる別のクラス (この場合は SubjectYouTubeChannel) を作成できるからです。そのサブジェクトに関する何かが変更された場合、そのサブジェクトに関連付けられているすべてのオブザーバーに通知して、すべてのオブザーバーが何かが変更されたことを知ることができます。

より良い例は、SubjectYouTubeChannel に「addVideo」メソッド (以下を参照) があり、モデレーター クラスとユーザー クラスの notify メソッドが異なるメールを送信して、変更を警告する場合です。

package observerpattern;

import java.util.ArrayList;
import java.util.List;
import observerpattern.IObserverSubscribe;

public class SubjectYouTubeChannel {    
    private List<IObserverSubscribe> subscribers = new ArrayList<IObserverSubscribe>(); 
    public void Subscribe(IObserverSubscribe ios){
        subscribers.add(ios);       
    }   
    public void Unsubscribe(IObserverSubscribe ios){        
        subscribers.remove(ios);
    }   
    public void notifySubscribers(){        
        for(IObserverSubscribe ios : subscribers ){         
            ios.Notify();           
        }       
     }
 public void addVideo(Video v){
     //... video add code
        notifySubscribers();
 }
 }

これは、次のようなクールなことを実行できることを意味します。

 package observerpattern;

 public class ObserverPattern {

    /**
     * The observer pattern is a software design pattern in which
     *  an object, called the subject, maintains a list of its dependents,
     *  called observers, and notifies them automatically of any 
     *  state changes, usually by calling one of their methods.
     *  It is mainly used to implement distributed event handling systems.
     *  The Observer pattern is also a key part in the familiar
     *  Model View Controller (MVC) architectural pattern. 
     */
    public static void main(String[] args) {

        SubjectYouTubeChannel sytc= new SubjectYouTubeChannel();// create youtube channel
        IObserverSubscribe user1= new ConcreteObserverYoutubeUser();
        IObserverSubscribe user2= new ConcreteObserverYoutubeUser();
        IObserverSubscribe moderator1= new ConcreteObserverYoutubeModerator();
        Video v = new Video() //imagine that class exists

        sytc.Subscribe(user1);
        sytc.Subscribe(user2);
        sytc.Subscribe(moderator1);
        sytc.Unsubscribe(user2);

        sytc.addVideo(v);
    //notifySubscribers() is called within SubjectYouTubeChannel's addVideo() so
    //all users and moderators who subscribe to the channel have been notified with 
    //messages corresponding to what they should do

    }
 }
于 2012-12-27T15:46:54.757 に答える