PHP パターン設計アダプター パターン、PHP パターン設計アダプター_PHP チュートリアル
PHP パターン設計 - アダプター パターン、PHP パターン設計アダプター
私は半月以上エッセイを書いていません。主な理由は、大学の 4 年生の間にたくさんのやっかいなことが起きるからです。仕事探しで壁にぶち当たった。私自身の力不足も大きかったのですが、それ以上に目立った実務経験がなかったため、人事部の関心を引くことが難しかったのです。それで、誰かが私に仕事を与えてくれることを願って、ここに小さな広告があります。私がインターンシップに参加していても、最悪、給料をもらえなくても大丈夫です(私はとてもショックを受けています)。結論はまったくありません)。場所は任意ですが、現状成都で残り1年を終えることしかできません。とにかくどこでもコードを書くことができます。
恥ずかしながら、私はいつも「素晴らしいことをたくさん知っているのに、この人生をうまく生きられない」と感じています。これらのブログ記事を読む人がいるかどうかに関係なく、彼らは常に自分の現在の知識を書き、さらに重要なことに、先輩から指導を受けることを望んでいます。
話題に戻りますが、先ほど 3 つの基本的な設計パターンを共有した後、今日はあまり使用しないと思われますが、必要なときに非常に便利なもう 1 つのパターン、アダプター パターンを共有します。
オブジェクトがあってもなくても「オブジェクト指向」が叫ばれるこの時代、オブジェクト指向を使いこなすと思いがけない便利さがもたらされます。プログラミングを学ぶ友人は、最初に数行のコードを書いて単純な関数を実装し、その後、いくつかの繰り返し操作を組み合わせて「関数」を形成することを学び、その後、「関数」と属性を組み合わせて「クラス」を形成することができます。段階的に、コードを実行するマシンの効率を向上させるとともに、プログラマーの作業負荷を軽減することも検討しています。 それでは、今日私たちが話しているアダプター モデルにおいて、より重要な考慮事項は何でしょうか?それはプログラマーの仕事量です。
アダプターモードはいつ使用されますか?
実際、最も単純な例は、サードパーティのライブラリを参照する場合です。このクラス ライブラリのバージョンが変更されると、提供される API も変更される可能性があります。残念ながら、アプリケーションで参照されている API が変更された場合は、心の中で「ウォカオ」と静かに悪口を言うだけでなく、思い切って多くのコードを変更する必要があります。
本当に必要ですか?従来であれば、私は「いいえ」と答えるでしょう。アダプターモードがあります~~
インターフェースが変わるとアダプターパターンが役に立ちます。
栗をください
上記の簡単な説明で理解できたのであれば、その優れた理解力には感心するほかありません。ほとんどの人はまだ混乱しているはずです。理解を容易にするために、ブロガーの例を引用します。元のアドレス。
始まりのハーモニー
Heizao Toy Companyはおもちゃの製造を専門とし、製造するおもちゃは犬、猫、ライオン、魚、その他の動物に限定されません。各おもちゃは「口を開ける」および「口を閉じる」操作を実行でき、それぞれ openMouth メソッドと closeMouth メソッドが呼び出されます。
現時点では、まず抽象クラス Toy を定義すればよい、あるいはインターフェイス Toy を定義すればよいと考えるのが簡単です。これらの問題は大きくなく、他のクラスは親クラスを継承して親クラスのメソッドを実装できます。 。調和と自信が生まれます。
バランスの破壊
ビジネスを拡大するために、Heizao Toy Company は、Hongzao Remote Control Company と提携し、遠隔制御装置を使用して動物の口を制御できるようになりました。しかし、Hongzao Remote Control Company のリモート コントロール デバイスは、動物の doMouthOpen および doMouthClose メソッドを呼び出します。 Heizao Toy Company のプログラマーが今しなければならないことは、Toy が doMouthOpen メソッドと doMouthClose メソッドを呼び出せるように、Toy シリーズのクラスをアップグレードすることです。
実装方法を検討する際、必要に応じてこの 2 つのメソッドを親クラスとサブクラスに追加するだけでよいと直接考えました。この2つのメソッドを親クラスとサブクラスに何度も追加すると、必ずその繰り返しの作業が解決できないか?何百ものサブクラスがあると、プログラマは気が狂ってしまうでしょう。プログラマーは、効率に影響を与えない場合に、誰がより「怠惰」であるかを競うことがよくあります。プログラマーはこれを続けると愚かだと感じるでしょう。 (実は私もよくこのバカみたいな行動をします)
リーリー
もっとイライラする
プログラマはコーディングを終えて水を一口飲んだところ、突然別のニュースが飛び込んできました。
平竿玩具会社も陸竿遠隔制御会社と協力したいと考えています。なぜなら、陸竿遠隔制御会社の遠隔制御装置は安価でより安定しているからです。しかし、Green Date Remote Control Company のリモコン デバイスは、動物の operMouth($type) メソッドを呼び出して口の制御を実現します。 $type が 0 の場合は「黙って」、それ以外の場合は口を開けてください。
ここで、プログラマは Toy とそのサブクラスをアップグレードして、Toy が operMouth() メソッドを呼び出せるようにする必要があります。もう誰も冷静ではありません。
リーリー
在这个时候,程序员必须要动脑子想办法了,就算自己勤快,万一哪天紫枣青枣黄枣山枣这些遥控公司全来的时候,忽略自己不断增多的工作量不说,这个Toy类可是越来越大,总有一天程序员不崩溃,系统也会崩溃。
问题在出在哪里呢?
像上面那样编写代码,代码实现违反了“开-闭”原则,一个软件实体应当对扩展开放,对修改关闭。即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。也就是说每个尸体都是一个小王国,你让我参与你的事情这个可以,但你不能修改我的内部,除非我的内部代码确实可以优化。
在这种想法下,我们懂得了如何去用继承,如何利用多态,甚至如何实现“高内聚,低耦合”。
回到这个问题,我们现在面临这么一个问题,新的接口方法我要实现,旧的接口(Toy抽象类)也不能动,那么总得有个解决方法吧。那就是引入一个新的类--我们本文的主角--适配器。 适配器要完成的功能很明确,引用现有接口的方法实现新的接口的方法。更像它名字描述的那样,你的接口不改的话,我就利用现有接口和你对接一下吧。
到此,解决方法已经呼之欲出了,下面贴上代码。
<?<span>php </span><span>abstract</span> <span>class</span><span> Toy { </span><span>public</span> <span>abstract</span> <span>function</span><span> openMouth(); </span><span>public</span> <span>abstract</span> <span>function</span><span> closeMouth(); } </span><span>class</span> Dog <span>extends</span><span> Toy { </span><span>public</span> <span>function</span><span> openMouth() { </span><span>echo</span> "Dog open Mouth\n"<span>; } </span><span>public</span> <span>function</span><span> closeMouth() { </span><span>echo</span> "Dog close Mouth\n"<span>; } } </span><span>class</span> Cat <span>extends</span><span> Toy { </span><span>public</span> <span>function</span><span> openMouth() { </span><span>echo</span> "Cat open Mouth\n"<span>; } </span><span>public</span> <span>function</span><span> closeMouth() { </span><span>echo</span> "Cat close Mouth\n"<span>; } } </span><span>//</span><span>目标角色:红枣遥控公司 </span> <span>interface</span><span> RedTarget { </span><span>public</span> <span>function</span><span> doMouthOpen(); </span><span>public</span> <span>function</span><span> doMouthClose(); } </span><span>//</span><span>目标角色:绿枣遥控公司及 </span> <span>interface</span><span> GreenTarget { </span><span>public</span> <span>function</span> operateMouth(<span>$type</span> = 0<span>); } </span><span>//</span><span>类适配器角色:红枣遥控公司 </span> <span>class</span> RedAdapter <span>implements</span><span> RedTarget { </span><span>private</span> <span>$adaptee</span><span>; </span><span>function</span> __construct(Toy <span>$adaptee</span><span>) { </span><span>$this</span>->adaptee = <span>$adaptee</span><span>; } </span><span>//</span><span>委派调用Adaptee的sampleMethod1方法 </span> <span>public</span> <span>function</span><span> doMouthOpen() { </span><span>$this</span>->adaptee-><span>openMouth(); } </span><span>public</span> <span>function</span><span> doMouthClose() { </span><span>$this</span>->adaptee-><span>closeMouth(); } } </span><span>//</span><span>类适配器角色:绿枣遥控公司 </span> <span>class</span> GreenAdapter <span>implements</span><span> GreenTarget { </span><span>private</span> <span>$adaptee</span><span>; </span><span>function</span> __construct(Toy <span>$adaptee</span><span>) { </span><span>$this</span>->adaptee = <span>$adaptee</span><span>; } </span><span>//</span><span>委派调用Adaptee:GreenTarget的operateMouth方法 </span> <span>public</span> <span>function</span> operateMouth(<span>$type</span> = 0<span>) { </span><span>if</span> (<span>$type</span><span>) { </span><span>$this</span>->adaptee-><span>openMouth(); } </span><span>else</span><span> { </span><span>$this</span>->adaptee-><span>closeMouth(); } } } </span><span>class</span><span> testDriver { </span><span>public</span> <span>function</span><span> run() { </span><span>//</span><span>实例化一只狗玩具 </span> <span>$adaptee_dog</span> = <span>new</span><span> Dog(); </span><span>echo</span> "给狗套上红枣适配器\n"<span>; </span><span>$adapter_red</span> = <span>new</span> RedAdapter(<span>$adaptee_dog</span><span>); </span><span>//</span><span>张嘴 </span> <span>$adapter_red</span>-><span>doMouthOpen(); </span><span>//</span><span>闭嘴 </span> <span>$adapter_red</span>-><span>doMouthClose(); </span><span>echo</span> "给狗套上绿枣适配器\n"<span>; </span><span>$adapter_green</span> = <span>new</span> GreenAdapter(<span>$adaptee_dog</span><span>); </span><span>//</span><span>张嘴 </span> <span>$adapter_green</span>->operateMouth(1<span>); </span><span>//</span><span>闭嘴 </span> <span>$adapter_green</span>->operateMouth(0<span>); } } </span><span>$test</span> = <span>new</span><span> testDriver(); </span><span>$test</span>->run();
最后的结果就是,Toy类及其子类在不改变自身的情况下,通过适配器实现了不同的接口。
最后总结
将一个类的接口转换成客户希望的另外一个接口,使用原本不兼容的而不能在一起工作的那些类可以在一起工作.
适配器模式核心思想:把对某些相似的类的操作转化为一个统一的“接口”(这里是比喻的说话)--适配器,或者比喻为一个“界面”,统一或屏蔽了那些类的细节。适配器模式还构造了一种“机制”,使“适配”的类可以很容易的增减,而不用修改与适配器交互的代码,符合“减少代码间耦合”的设计原则。
以上
系列文章:
php模式设计之 单例模式
php模式设计之 工厂模式
php模式设计之 注册树模式
php模式设计之 适配器模式

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java フレームワークにおけるデザイン パターンとアーキテクチャ パターンの違いは、デザイン パターンがソフトウェア設計における一般的な問題に対する抽象的な解決策を定義し、ファクトリ パターンなどのクラスとオブジェクト間の相互作用に焦点を当てていることです。アーキテクチャ パターンは、階層化アーキテクチャなどのシステム コンポーネントの編成と相互作用に焦点を当てて、システム構造とモジュールの間の関係を定義します。

デコレータ パターンは、元のクラスを変更せずにオブジェクトの機能を動的に追加できる構造設計パターンです。抽象コンポーネント、具象コンポーネント、抽象デコレータ、具象デコレータの連携によって実装され、ニーズの変化に合わせてクラス機能を柔軟に拡張できます。この例では、ミルクとモカのデコレーターが総額 2.29 ドルで Espresso に追加されており、オブジェクトの動作を動的に変更するデコレーター パターンの力を示しています。

1. ファクトリ パターン: オブジェクト作成とビジネス ロジックを分離し、ファクトリ クラスを通じて指定された型のオブジェクトを作成します。 2. オブザーバー パターン: サブジェクト オブジェクトが状態の変化をオブザーバー オブジェクトに通知できるようにし、疎結合とオブザーバー パターンを実現します。

デザイン パターンは、再利用可能で拡張可能なソリューションを提供することで、コード メンテナンスの課題を解決します。 オブザーバー パターン: オブジェクトがイベントをサブスクライブし、イベントが発生したときに通知を受信できるようにします。ファクトリ パターン: 具象クラスに依存せずにオブジェクトを作成するための集中的な方法を提供します。シングルトン パターン: クラスには、グローバルにアクセス可能なオブジェクトの作成に使用されるインスタンスが 1 つだけ存在することが保証されます。

アダプター パターンは、互換性のないオブジェクトが連携できるようにする構造設計パターンであり、オブジェクトがスムーズに対話できるように、あるインターフェイスを別のインターフェイスに変換します。オブジェクト アダプタは、適応されたオブジェクトを含むアダプタ オブジェクトを作成し、ターゲット インターフェイスを実装することにより、アダプタ パターンを実装します。実際のケースでは、クライアント (MediaPlayer など) はアダプター モードを通じて高度な形式のメディア (VLC など) を再生できますが、クライアント自体は通常のメディア形式 (MP3 など) のみをサポートします。

TDD は、高品質の PHP コードを作成するために使用されます。その手順には、テスト ケースを作成し、期待される機能を記述し、テスト ケースを失敗させることが含まれます。過度な最適化や詳細な設計を行わずに、テスト ケースのみが通過するようにコードを記述します。テスト ケースが合格したら、コードを最適化およびリファクタリングして、可読性、保守性、およびスケーラビリティを向上させます。

Guice フレームワークは、次のような多くの設計パターンを適用します。 シングルトン パターン: @Singleton アノテーションによってクラスのインスタンスが 1 つだけであることを保証します。ファクトリ メソッド パターン: @Provides アノテーションを使用してファクトリ メソッドを作成し、依存関係の注入中にオブジェクト インスタンスを取得します。戦略モード: アルゴリズムをさまざまな戦略クラスにカプセル化し、@Named アノテーションを通じて特定の戦略を指定します。

Java フレームワークでデザイン パターンを使用する利点には、コードの可読性、保守性、拡張性の向上が含まれます。欠点としては、複雑さ、パフォーマンスのオーバーヘッド、使いすぎによる学習曲線の急上昇などが挙げられます。実際のケース: プロキシ モードはオブジェクトの遅延読み込みに使用されます。デザイン パターンを賢く使用して、その利点を活用し、欠点を最小限に抑えます。
