2

問題
私はデザインパターンにかなり慣れておらず、「HeadFirstDesignPatterns」という本を研究しています。メンバー、モデレーター、管理者の3種類のユーザーでシステムを実装する必要があります。モデレーターは、メンバーが実行できるすべての機能に加えて、追加された機能を実行できます。管理者は、モデレーターが実行できるすべての機能に加えて、追加機能を実行できます。これをインターフェースとクラスで実装する方法の基本的なスケッチを作成しました。経験が浅いので、この設計についてSOコミュニティからのアドバイスが必要です。肥大化しすぎているか、ばかげているか、修正が必要かどうかなどです。だから我慢してください。

考えられる解決策
インターフェースは次のとおりです。

public interface AdminBehavior
{
    public addUser();
    public deleteUser();
}

public interface ModeratorBehavior
{
    public blockUser();
    public deletePost();
}

行動クラス:

public class AdminBehaviors implements AdminBehavior
{
    public addUser()        {
        ...
    }
    public deleteUser()     {
        ...
    }
}

public class NoAdminBehaviors implements AdminBehavior
{
    public addUser()        {
        ...//cannot do
    }
    public deleteUser()     {
        ...//cannot do
    }
}

+ Same as above done for Moderators...classes ModeratorBehaviors and NoModeratorBehaviors

実際のユーザークラス:

public class Member
{
    protected ModeratorBehavior moderatorBehavior;
    protected AdminBehavior adminBehavior;

    public Member()     {
        moderatorBehavior = new NoModeratorBehavior();
        adminBehavior = new NoAdminBehavior();
    }

    public login()      {
        ...
    }
    public logout()     {
        ...
    }
    public post()       {
        ...
    }
    public comment()        {
        ...
    }

    //Moderator priv'ed actions
    public blockUser()      {
        moderatorBehavior.blockUser();
    }
    public deletePost()     {
        moderatorBehavior.deletePost();
    }

    //Admin priv'ed actions
    public addUser()        {
        adminBehavior.addUser();
    }
    public deleteUser()     {
        adminBehavior.deleteUser();
    }
}

public class Moderator extends Member
{
    public Moderator()  {
        moderatorBehavior = new ModeratorBehavior();
        adminBehavior = new NoAdminBehavior();
    }
}

public class Admin extends Moderator ((or Member?))
{
    public Admin()  {
        moderatorBehavior = new ModeratorBehavior();
        adminBehavior = new AdminBehavior();
    }
}

個人的には、これは少しやり過ぎか混乱しているように思えます...それを行うためのより良い方法はありますか?

4

4 に答える 4

2

私はそれがとても好きです...しかし、肥大化しているように見えます。

私はおそらく継承を使用するでしょう。Admin extends Moderator extends Member 実装 UserType。

  • UserType インターフェイスはすべてのメソッドを定義できます
  • メンバーはすべてのメソッドを実装できますが、非動作
  • モデレーターはメンバーから継承し、動作が必要なメソッドをオーバーライドできます
  • 管理者はモデレーターから継承し、動作が必要な追加のメソッドをオーバーライドできます

    その方が簡単だと思いますが、賢くはありません

  • 于 2012-01-04T21:35:11.867 に答える
    1

    モデレーターがメンバーのすることを何でもできるし、管理者がモデレーターのすることを何でもできる場合。

    インターフェイスメンバー、モデレーターがそれを拡張し、管理者がモデレーターを拡張しないのはなぜですか?

    public interface Member {
      void foo();
    }
    
    public interface Moderator extends Member {
      void bar();
    }
    
    public interface Admin extends Moderator {
      void boo();
    }
    

    あなたが説明したことに対する行動が最善のアプローチであるかどうかはわかりません。

    于 2012-01-04T21:40:50.050 に答える
    0

    メンバーインターフェイスをスーパーインターフェイスにすることで、これを単純化できると思います。モデレーターインターフェイスはメンバーインターフェイスを拡張し、管理者はモデレーターインターフェイスを拡張します。このようにして、管理者はメンバーおよびモデレーターとしてすべての特権を取得します。管理メンバー実装クラスは、デフォルトでスーパーインターフェイスからすべての操作を取得する管理インターフェイスを拡張します。同様に、他の実装クラスは対応するインターフェースを実装します。どの柄なのかわかりませんが、綺麗に見えます。

    于 2012-01-04T21:29:29.233 に答える
    0

    まず第一に、管理者はすべてのモデレーター機能といくつかのモデレーター機能を持っているため、モデレーターを拡張する必要があります。モデレーターと管理者のインターフェースが異なる場合を除き、新しいアイテム (特権ユーザー) で動作を拡張するか、少なくとも実装する必要があります。メンバーに特権メソッドを含めないでください。特権ユーザーに移動する必要があります。ビューでは、通常のユーザーは特権ユーザーのコマンドを呼び出すことはできません。「メンバー」にはこれらのメソッドがないため、これを行うとエラーが発生します。

    于 2012-01-04T21:25:54.103 に答える