2

私はオブザーバーパターンに頭を悩ませようとしています、そして概念的には-私はそれを理解しています、それはたくさんのものにとって本当に有益であるようです...

ただし...すべての例と私が行っている読書では、すべての例で「単一の」データポイントと、そのデータポイントを管理する単一のクラスが使用されているようです。したがって、もちろん、「x」が変更された場合は、他の人に通知してください。 (登録済み)クラス..。

複数のデータポイントを変更する可能性のあるクラスに複数のメソッドがある場合、どうしますか?-特定の「メソッド」に登録することになっている「オブザーバー」です-または「onchange」メソッドを追加しますか-

たとえば、いくつかの通常のCRUDメソッドを使用したUSERオブジェクトを例にとると、「挿入」、「更新」、「削除」...これらの各メソッドは「データを変更」します。

2つのオブザーバー(「logging」オブジェクト)があり、UIオブジェクトがユーザー名に関連付けられている場合...明らかに、ログオブジェクトはデータの変更について知りたいのに対し、UIオブジェクトはユーザー名のみを考慮します。

これらの複数のデータポイントをどのように処理しますか?(うまくいけば)各データポイントを個別に更新するコードを記述せず、それぞれを「監視」するように登録します!!! それはばかげているでしょう。

引数のために-ユーザーの「属性」が100データポイントであると仮定します-(first、middle、last、dob、username、email、password、lastloginなど...)そして「updateUser」メソッドが起動します-lastloginのみを変更します...「通知」はUIにアラートを送信しないことを決定する条件付きロジックを処理しますか(またはUIはアラートを送信します(「ユーザー」のオブザーバーであるため)、UIオブジェクトには通知を処理するメソッドがあり、ITは通知を処理します'lastlogin'が興味を持たないと判断するための条件付きロジック。

4

1 に答える 1

3

メソッドごとにオブザーバーを登録する必要はありません。オブザーバーを次のように分類できます。

 private Observer[] updateObservers;
 private Observer[] usernameUpdateObservers;

オブザーバーが自分自身を登録するとき、自分自身をどのグループに入れるかを知る必要があります。その後、ユーザー クラスは適切なグループに通知します。

  public void setUsername(String username) {
    this.username = username;
    notify(updateObservers);
    notify(usernameUpdateObservers);
  }

  public void setEmail(String email) {
    this.email = email;
    notify(updateObservers);
  }

ただし、オブジェクトのすべてのアクションを監視している場合は、プロキシの方が適している場合があります。少し Java の例を示します (これを Java で動的に行う方法がありますが、要点を説明するために、ここに長いバージョンを示します)。

 public interface User {
   void setUsername(String username);
   void setEmail(String email);
 }

 public class LoggingUserProxy implements User {
   private User user;

   public LoggingUserProxy(User user) { this.user = user; }

   public void setUsername(String username) {
     user.setUsername(username);
     log("updated username to " + username);
   }

   public void setEmail(String email) {
     user.setEmail(email);
     log("updated emailto " + email);
   }

ユーザーを作成するときに、プロキシでラップします

   User user = new LoggingUserProxy(realUser);

インターフェイスは変更されておらず、ユーザー オブジェクトはすべての notify() 呼び出しで汚染されていません。

于 2012-08-14T16:22:30.107 に答える