ホームページ  >  記事  >  バックエンド開発  >  PHP のブリッジ モードについての簡単な説明

PHP のブリッジ モードについての簡単な説明

青灯夜游
青灯夜游転載
2021-07-21 19:53:232889ブラウズ

前回の記事「PHPのメモモードについて話そう」ではPHPのメモモードについて紹介しましたが、次の記事ではPHPのデザインパターンにおけるブリッジモードについて理解していきます。

PHP のブリッジ モードについての簡単な説明

ブリッジ モードは、プログラミングの世界では、実際には結合/集約と同義です。なぜそんなことを言うのですか?オブジェクト指向に精通している私たちは、継承のメリットをよく知っており、サブクラスは親クラスの多くの属性や機能を共有できます。ただし、継承には重大な結合という問題も伴います。親クラスの変更はサブクラスにある程度の影響を及ぼします。メソッドや属性の変更であっても、すべてのサブクラスでそれを変更する必要がある場合があります。これはオープンカプセル化の原則に違反します。ブリッジングはこの問題を解決するもので、利用可能なメソッドを共有するために組み合わせ/集約を使用することに重点を置いています。 PHP のトレイトについて考えたことがあると思いますが、仕事でこの機能を使用したことがあるなら、すでにブリッジ モードを使用していることになります。

Gof クラス図と説明

GoF 定義: 抽象部分を実装部分から分離し、独立して変更できるようにします。

#GoF クラス図

PHP のブリッジ モードについての簡単な説明

##コード実装

interface Implementor
{
    public function OperationImp();
}

class ConcreteImplementorA implements Implementor
{
    public function OperationImp()
    {
        echo '具体实现A', PHP_EOL;
    }
}

class ConcreteImplementorB implements Implementor
{
    public function OperationImp()
    {
        echo '具体实现B', PHP_EOL;
    }
}
まず、実際に実行される機能である実装インターフェイスとその特定の実装を定義しましょう。アダプターパターンのAdapteのようなものです。

abstract class Abstraction
{
    protected $imp;
    public function SetImplementor(Implementor $imp)
    {
        $this->imp = $imp;
    }
    abstract public function Operation();
}

class RefinedAbstraction extends Abstraction
{
    public function Operation()
    {
        $this->imp->OperationImp();
    }
}

抽象クラスのインターフェイスを定義し、実装への参照を維持します。特定の抽象クラスの実装メソッドでは、インターフェイスを実装する実際の操作メソッドを直接呼び出します。アダプター内のアダプターに似ています。

$impA = new ConcreteImplementorA();
$impB = new ConcreteImplementorB();

$ra = new RefinedAbstraction();

$ra->SetImplementor($impA);
$ra->Operation();

$ra->SetImplementor($impB);
$ra->Operation();

クライアントによって呼び出されたとき、抽象クラスはさまざまな実装クラスを使用して操作メソッドを多態性にすることができます。

ソース コードの説明では、このモードがアダプター モードと非常に似ていることがわかります。ただし、アダプターの目的は、無関係な 2 つのクラスが連携して中間変換作業を実行できるようにすることです。ブリッジングの目的は、メソッドの動作の継承結合を分離し、動作を簡単に追加、変更、および動的に呼び出すことにより、抽象インターフェイスと実装部分を独立して変更できるようにすることです。
  • そうすることで、抽象インターフェイスと実装部分は独立して変更できる これは、実装インターフェースへの参照が維持されている限り、実装インターフェースの特定の実装クラスは、異なる機能を備えた完全に異なるクラスにすることができ、自由に変更できることを意味します。それが何であるかは実装に決定させてください。
  • ブリッジ モードの利点: インターフェイスとその実装部分の共有、スケーラビリティの向上、実装の詳細が顧客に透過的になる
  • ブリッジ モードによって解決される主な問題は、システムの継続的な成長によって引き起こされます。継承 密結合問題
  • 合成と集約: 集約は弱い関係です。A には B が含まれますが、B は A の一部ではありません。組み合わせは強い関係です。A には B が含まれ、B も A の一部です。 、全体と部分の関係
私たちの携帯電話にはさまざまなモデルがあり、各モデルはほぼ同じですが異なるアクセサリを製造しています。例えば、X1 携帯電話ケース、フィルム、イヤホン、X2 携帯電話ケース、フィルム、イヤホンなど。コストの問題により、携帯電話のモデルごとに完全に異なるアクセサリは製造されません。代わりに、携帯電話の各モデル (抽象化) を組み合わせて (ブリッジ)、消費者に販売できるように、外部の汎用アクセサリ (インプリメンター) を使用するようにしてください。このようにして、当社の携帯電話ブランドが資金不足になったり、早期に終了したりすることはありません。ビジネスの経営とデザインパターンの学習の間には、実に多くの相関関係があるようです。 !

#完全なコード: https://github.com/zhangyue0503/designpatterns-php/blob/master/18.bridge/source/bridge.php

##例

SMS 送信はブリッジを使用して実装することもできます。多数のテキスト メッセージ テンプレートがあり、さまざまなテキスト メッセージ プロバイダーを使用してテキスト メッセージを送信するとします。このとき、ブリッジモードを使用してさまざまな組み合わせを形成できます。

SMS 送信クラス図

完全なソース コード: https://github.com/zhangyue0503/designpatterns- php /blob/master/18.bridge/source/bridge-message.phpPHP のブリッジ モードについての簡単な説明

<?php

interface MessageTemplate
{
    public function GetTemplate();
}

class LoginMessage implements MessageTemplate
{
    public function GetTemplate()
    {
        echo &#39;您的登录验证码是【AAA】,请不要泄露给他人【XXX公司】!&#39;, PHP_EOL;
    }
}
class RegisterMessage implements MessageTemplate
{
    public function GetTemplate()
    {
        echo &#39;您的注册验证码是【BBB】,请不要泄露给他人【XXX公司】!&#39;, PHP_EOL;
    }
}
class FindPasswordMessage implements MessageTemplate
{
    public function GetTemplate()
    {
        echo &#39;您的找回密码验证码是【CCC】,请不要泄露给他人【XXX公司】!&#39;, PHP_EOL;
    }
}

abstract class MessageService
{
    protected $template;
    public function SetTemplate($template)
    {
        $this->template = $template;
    }
    abstract public function Send();
}

class AliYunService extends MessageService
{
    public function Send()
    {
        echo &#39;阿里云开始发送短信:&#39;;
        $this->template->GetTemplate();
    }
}

class JiGuangService extends MessageService
{
    public function Send()
    {
        echo &#39;极光开始发送短信:&#39;;
        $this->template->GetTemplate();
    }
}

// 三个短信模板
$loginTemplate = new LoginMessage();
$registerTemplate = new RegisterMessage();
$findPwTemplate = new FindPasswordMessage();

// 两个短信服务商
$aliYun = new AliYunService();
$jg = new JiGuangService();

// 随意组合
// 极光发注册短信
$jg->SetTemplate($registerTemplate);
$jg->Send();

// 阿里云发登录短信
$aliYun->SetTemplate($loginTemplate);
$aliYun->Send();

// 阿里云发找回密码短信
$aliYun->SetTemplate($findPwTemplate);
$aliYun->Send();

// 极光发登录短信
$jg->SetTemplate($loginTemplate);
$jg->Send();

// ......

説明

これは集約モードです。テンプレートは SMS 送信の一部ではありません。テンプレートを使用せずに直接送信できます。これらには強い関係はありません。

SMS 送信方法を変更する必要はありません。別の SMS テンプレートを渡すだけで済みます。
    #is-a 関係でなければならないかどうかわからない場合は、ブリッジ モードなどの結合/集約設計手法を使用することをお勧めします。現在のクラス関係は is-a です。その場合は、ためらわずに継承を使用してください。
  • 元のアドレス: https://juejin.cn/post/6844903986655395848
  • 著者:ハードコアプロジェクトマネージャー

推奨学習: 「PHP ビデオ チュートリアル

以上がPHP のブリッジ モードについての簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。