Facadeパターン

      2018/06/15

複数のメソッド・インターフェースを組み合わせて行う処理を1クラスに定義することで、使用側クラスの実装を容易にするための手法です。

サンプル

戦士名簿クラス

public class WarriorRoster
{
    /// <summary>
    /// 条件に一致した戦士を検索する.
    /// </summary>
    /// <param name="minLevel">最低レベル.</param>
    /// <param name="sexType">性別.</param>
    /// <returns>条件に一致した戦士の名前一覧.</returns>
    public string[] SearchWarriors(int minLevel, int sexType) {
        List<string> searchResult = new List<string>();
        // 検索処理.
        return searchResult.ToArray();
    }
}

雇用台帳クラス

public class EmploymentFilter
{
    public bool IsFree(string name) {
        bool isFree = false;
        // 雇用済み判定.
        return isFree;
    }
}

Facadeクラス

public class LuidaFacade
{
    /// <summary>
    /// 雇用可能な戦士を検索する.
    /// </summary>
    /// <param name="minLevel">最低レベル.</param>
    /// <param name="sexType">性別.</param>
    /// <returns>雇用可能な戦士の名前一覧.</returns>
    public string[] RequestWarrior(int minLevel, int sexType) {
        WarriorRoster warriorRoster = new WarriorRoster();
        EmploymentFilter employmentFilter = new EmploymentFilter();

        string[] warriors = warriorRoster.SearchWarriors(minLevel, sexType);

        List<string> searchResult = new List<string>();

        foreach (string name in warriors) {
            if (employmentFilter.IsFree(name)) {
                searchResult.Add(name);
            }
        }

        return searchResult.ToArray();
    }
}

使用側

LuidaFacade luida = new LuidaFacade();
string[] getList = luida.RequestWarrior(10, 1); // 1=Man
LuidaFacade luida = new LuidaFacade();
string[] getList = luida.RequestWarrior(10, 2); // 2=female

使用側は戦士名簿クラス雇用台帳クラスを知らなくても目的の一覧を得ることができました。
もっと複雑な処理になるほどクラス・メソッド化の意味が出てきます。

 - 設計