はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】機能の階層と実装の階層を分けるBridgeパターンを学ぶ

はじめに

今回は機能の階層と実装の階層を分けるBridgeパターンを紹介したいと思います。

f:id:hanaaaaaachiru:20210411232525p:plain
クラス図

概要

wikipedia先輩には以下のように表記されていました。

Bridge パターン(ブリッジ・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。 「橋渡し」のクラスを用意することによって、クラスを複数の方向に拡張させることを目的とする。

Bridge パターン - Wikipedia

登場人物

名前 意味
Abstraction 「機能のクラス階層」の最上位のクラス。Implementorのインスタンスを保持
RefinedAbstraction Abstractionに対して機能追加したクラス
Implementor 「実装のクラス階層」の最上位クラス。インターフェイス(API)を規定
ConcreteImplementor 具体的なImplementor
f:id:hanaaaaaachiru:20210411232525p:plain
クラス図

Bridgeパターンは機能と実装を分けることが本質なので,そこを意識しながらみていくとより理解しやすいと思います。

AbstractionRefinedAbstraction機能で,ImplementorConcreteImplementor実装です。

実装例

/// <summary>
/// 機能クラス
/// </summary>
public class Abstraction
{
    protected Implementor _impl;

    public Abstraction(Implementor impl)
    {
        _impl = impl;
    }

    public void Execute()
    {
        _impl.Execute();
    }
}

/// <summary>
/// 機能を追加したクラス
/// </summary>
public class RefinedAbstraction : Abstraction
{
    public RefinedAbstraction(Implementor impl) : base(impl) { }

    public void Execute5times()
    {
        for (int i = 0; i < 5; i++)
            Execute();
    }
}

/// <summary>
/// 実装クラス
/// </summary>
public abstract class Implementor
{
    public abstract void Execute();
}

/// <summary>
/// 実装の具象クラス
/// </summary>
public class ConcreteImplementor : Implementor
{
    public override void Execute()
    {
        Console.Write("Execute");
    }
}

ざっくりとした私の感覚ですが、「機能の実装を委譲を用いて切り離す」というイメージでしょうか。

その上機能の追加を行いたければAbstractionのサブクラスを,実装の仕組みを変えたければImplementorを実装(継承)したクラスを作っていくというクラス設計の基本的な考え方を取り入れた感じだと思います。

またWikipediaの利用例の箇所はBridgeパターンの有用な使い方が紹介されていたので良ければ一読をしてみると面白いかもしれません。
Bridge パターン - Wikipedia

さいごに

Bridgeパターンの仕組みはStrategyパターンと全く同じで、委譲しただけのシンプルなものです。

まあそれだけ委譲(正式名称は転送?)が重要な考え方であるという見方もできるのかもしれませんね。

今回はこれくらいで。ではまた。