Java入門(第13回)

前回振り返り

デザインパターンとは

デザインパターンとは、先人達が発見し編み出した設計ノウハウが、再利用しやすいように特定の規約に従ってカタログ化されているものです。パターンに沿った実装を試すことで、自ずとオブジェクト指向への理解も深まってくるでしょう。

C#/Javaをマスターする為の近道

通称 Gang of Four、略称 GoF の4人組(Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides)、彼らによって書かれた書籍、Design Patterns: Elements of Reusable Object-Oriented Software(邦題:オブジェクト指向における再利用のためのデザインパターン)において、23個のパターンが提唱されました。

代表的なパターンを幾つか実装してみましょう。

Strategyパターン

データ構造に対して適用する一連のアルゴリズムをカプセル化し、アルゴリズムの切り替えを容易にするパターンです。

このパターンでは、あるオブジェクトが、その動作の一部または全部を、特定のインターフェースに従った別のオブジェクトの観点から定義することができます。 このインターフェースの特定のインスタンスは、それがインスタンス化されたり呼び出されたりしたときにクライアントに提供され、使用される具体的な動作を提供します。 Strategyデザインパターンは、単一責任原則明示的依存関係原則依存関係逆転原則を実現するために広く使用され、依存性注入(Dependency Injection)と制御逆転(Inversion of Control)コンテナの使用の鍵となるものです。

Strategyパターンのクラス図

前回演習問題の解答 例

問題1

問題文

Strategy パターン をインターフェースを使って作成してみましょう。


解答例

public class Sample1 {

    public static void main(String[] args) {
        Syain syain;

        // 異なるアルゴリズムに従う3つのコンテキスト。
        syain = new Syain(new Hira());
        syain.standup();

        syain = new Syain(new Kacho());
        syain.standup();

        syain = new Syain(new Bucho());
        syain.standup();
    }
}
interface ISyain {
    void standup();
}
public class Syain {
    ISyain syain;

    // Constructor
    public Syain(ISyain syain) {
        this.syain = syain;
    }

    public void standup() {
        this.syain.standup();
    }
}
class Hira implements ISyain {
    public void standup() {
        System.out.println("平社員がしゃきっと立ちました。");
    }
}
class Kacho implements ISyain  {
    public void standup() {
        System.out.println("課長がゆっくりと立ちました");
    }
}
class Bucho implements ISyain {
    public void standup() {
        System.out.println("部長が偉そうに立ちました。");
    }
}

問題2

問題文

Strategy パターン を抽象クラスを使って作成してみましょう。


解答例

public class Sample2 {

    public static void main(String[] args) {
        Syain syain;

        // 異なるアルゴリズムに従う3つのコンテキスト。
        syain = new Syain(new Hira());
        syain.standup();

        syain = new Syain(new Kacho());
        syain.standup();

        syain = new Syain(new Bucho());
        syain.standup();
    }
}
abstract class AbstractSyain {
    public abstract void standup();
}
public class Syain {
    AbstractSyain syain;

    // Constructor
    public Syain(AbstractSyain syain) {
        this.syain = syain;
    }

    public void standup() {
        this.syain.standup();
    }
}
class Hira extends AbstractSyain {
    public void standup() {
        System.out.println("平社員がしゃきっと立ちました。");
    }
}
class Kacho implements AbstractSyain  {
    public void standup() {
        System.out.println("課長がゆっくりと立ちました");
    }
}
class Bucho extends AbstractSyain {
    public void standup() {
        System.out.println("部長が偉そうに立ちました。");
    }
}

今回の演習問題

問題1

問題文

Decoratorパターン を作成してみましょう。

wikipedia のJava実装例を記述してみましょう。

問題2

問題文

問1のクラスを身近なものにアレンジしてみましょう。

コメント