-1

ファクトリ、ストラテジー、または MVC のデザイン パターンかどうか教えてください。

public interface MainObject<T>
{
    void add();
    T get();
}

class Person1 : MainObject<Person1>
{
    public Person1(int id, string name) 
    { 
        // define
    }

    public void add() 
    {
        // add
    }

    public Person1 get()
    {
        // return
    }
}

class Person2 : MainObject<Person2>
{
    public Person2(int id, string name, bool status) 
    { 
         // define
    }

    public void add() 
    {
        // add
    }

    public Person2 get()
    {
        // return
    }
}

class Client
{
    public User()
    {
    }

    public void add<T>(T obj) where T : Object<T>
    {
        obj.add();
    }

    public T get<T>(T obj) where T : Object<T>
    {
        return obj.get();
    }
}

static class Program
{
    static void Main()
    {
        Client client = new Client();
        client.add( new Person1(123,"Duke") );
        client.add( new Person2(456,"Dave",true) );
        Person1 foundPerson1 = client.get( new Person1(123,null) ); // (123,"Duke")
        Person2 finedPerson2 = client.get( new Person1(null,"Dave",null) ); // (456,"Dave",true)
    }
}

ファクトリ パターンとストラテジー パターンを使用してコードを記述しましたが、ここで MVC MVC パターンの違いの実現を確認しました。それが私のコードです。今、私は自分のコードがどのパターンであるかを混乱させました。

4

1 に答える 1

0

ストラテジー パターンは、呼び出しコードが実装に関与することなく、さまざまな動作を提供する方法です。例えば:

interface IPersonRepository{
    IPerson GetPerson();
}

class PersonRepository : IPersonRepository{
    public IPerson GetPerson(){
        return GetDataFromDatabase();
    }

    private IPerson GetDataFromDatabase(){
        // Get data straight from database.
    }
}

class PersonRespositoryWithCaching : IPersonRepository{
    public IPerson GetPerson(){
        IPerson person = GetDataFromCache();
        // Is person in cache?
        if(person!=null){
            // Person found in cache.
            return person;
        }else{
            // Person not found in cache.
            person = GetDataFromDatabase();
            StoreDataInCache(person);
            return person;
        }
    }

    private IPerson GetDataFromCache(){
        // Get data from cache.
    }

    private IPerson GetDataFromDatabase(){
        // Get data straight from database.
    }
}

class Program{
    static void Main(){
        IPersonRepository repository = null;

        if(cachingEnabled){
            repository = new PersonRepositoryWithCache();
        }else{
            repository = new PersonRepository();
        }

        // At this point the program doesn't care about the type of
        // repository or how the person is retrieved.
        IPerson person = repository.GetPerson();
    }
}

Factory パターンは Strategy パターンと構造が似ていますが、異なる一般的な動作を実装するのではなく、ファクトリは異なるオブジェクトを作成します。例えば:

interface IPerson{}

class SomePerson : IPerson{}

class OtherPerson : IPerson{}

interface IPersonFactory{
    void IPerson Create();
}

class SomePersonFactory : IPersonFactory{
    public void IPerson Create(){ return new SomePerson(); }
}

class OtherPersonFactory : IPersonFactory{
    public void IPerson Create(){ return new OtherPerson(); }
}

MVC パターンは、データをユーザーに表示するためのコードが、データを取得したりアプリケーションを操作したりするためのコードと混ざらないようにする方法です。モデルはデータをメモリに保持し、ビューはそれをユーザーに表示し、コントローラーはユーザーがデータとアプリケーションを操作できるようにします。

リポジトリやサービスなどのオプションのパターンは、外部データ ソースとやり取りするコードやビジネス ロジックを実行するコードを分離します。

MVC パターンの利点は、さまざまなコンポーネントの実装を交換して、データベースや Web サービスからデータを取得したり、データをテーブルやグラフとして表示したりできることです。繰り返しますが、これは戦略パターンに似ています。

コードにはモデルとリポジトリの要素があります。ただし、(他のコンポーネントがないだけでなく) コードが混在しているため、真の MVC ではありません。

于 2013-05-17T20:23:42.823 に答える