JavaScriptデザインパターン構成パターン分析_jsオブジェクト指向
どう言えばいいでしょうか? !動物(結合体)と同じように、子孫(葉っぱのオブジェクト)を産むと、その子孫にはある機能(例:穴を掘る、耳が聞こえるなど)が生まれます。ルート (複合オブジェクト) があり、その後、ツリーから外側に伸びる他の枝 (複合オブジェクト) と、それらの枝から外側に伸びる葉 (リーフ オブジェクト) があります。言い換えれば、祖先がすでに存在する場合、この祖先から派生した他の子(この祖先の下に結合された他のオブジェクトを含む)がすでに特定の機能を持っている限り、それは継承に似ています。 「合成パターン」では、合成オブジェクトの階層にリーフオブジェクトと合成オブジェクトの2種類のオブジェクトがあります。組み合わせたパターンは、多数のオブジェクトを操作するのに適しています。
「合成モード」とは、プロジェクトで作業するときに、プロジェクトに表示されるすべてのメソッドを合成オブジェクト (リーフ オブジェクトのメソッドを含む) で定義する必要があり、それらのリーフ オブジェクトが合成オブジェクトを継承することを意味します。複合オブジェクトがインスタンス化されると、それに応じてそのリーフ オブジェクトのメソッドもインスタンス化されます。私が言ったことは少しわかりにくいかもしれませんので、例を使って説明しましょう。
「コンポジションモード」は、ウェブ上で動的なユーザーインターフェイスを作成するために調整されたモードです。このパターンを使用すると、単一のコマンドで複数のオブジェクトに対して複雑な動作または再帰的な動作をトリガーできます。
「結合モード」を使用すると、次の 2 つの大きな利点が得られます。
1. オブジェクトのコレクションと特定のサブオブジェクトを同じ方法で処理できます。
2. サブオブジェクトのバッチをツリー構造に編成するために使用でき、ツリー全体を走査できます。
結合モードは、次の 2 つの条件が同時に満たされる場合にのみ適しています:
1. 特定の階層システムに編成されたオブジェクトのバッチがある (開発中に特定の構造が不明な場合があります)。
2. このオブジェクトのバッチまたはその一部に対して操作を実行したいと考えています。
例を見てみましょう:
具体的な要件は、フォト ギャラリーを作成し、フォト ギャラリーの特定の部分を選択的に非表示または表示できるようにすることです。これは、単一の画像または画像のギャラリーである場合があります。この関数を完了するには、画像ライブラリとして使用される複合オブジェクト クラスと、画像自体に使用されるリーフ オブジェクト クラスの 2 つのクラスが必要です。コードは次のとおりです。
上記のコードで、最初に定義されているのは、複合オブジェクト クラスとリーフ オブジェクト クラスが実装する必要があるインターフェイス。ビジョンとペニーの従来の組み合わせに加えて、このタイプの操作には非表示と表示のみが含まれます。次に、葉オブジェクトを定義します。リーフ オブジェクトは非表示と表示を実装します。 コードは次のとおりです。
var Composite = new Interface('Composite', ['add', 'remove', 'getChild']); // 複合オブジェクト Composite に必要なメソッドを確認します
var GalleryItem = new Interface( 'GalleryItem', ['hide', 'show']); // 結合されたオブジェクト GalleryItem が持つべきメソッドを確認します
// DynamicGallery クラス
var DynamicGallery = function(id){ // 実装します複合、GalleryItem の組み合わせ オブジェクト クラス
this.children = [];
this.element = document.createElement('div');
this.element.id = id; .element.className = 'dynamic-gallery';
}
DynamicGallery.prototype = {
// Composite 複合オブジェクト インターフェイスを実装します
add: function(child){
Interface.ensureImplements (child, Composite, DynamicGallery);
this.children.push(child);
},
削除 : function(child); {
for (var node, i = 0; node = this.getChild(i); i ){
},
// DynamicGallery 複合オブジェクトを実装しますインターフェース
隠す : function(){
} for(var ノード, i = 0; ノード = this.getChild(i); i ){
ノード.hide(); 🎜> for(var ノード, i = 0; ノード = getChild(i); i ){
ノード.show();
}
},
// ヘルパー メソッド
getElement : function(){
return this.element;
}
}
リーフ オブジェクトを設定するための対応するメソッドは次のとおりです:
コードをコピー
コードは次のとおりです:
// GalleryImage クラス
var GalleryImage = function(src){ メソッドを実装しますComposite と GalleryItem の組み合わせオブジェクトで定義されています
this.element.className = 'gallery-image';
this.element.src = src;
Hide : function(){
this.element.style.display = 'none';
},
show : function(){
this.element.style.display = ''; > // ヘルパー メソッド
getElement: function(){
return this.element
}
}
これは、複合モードがどのように機能するかを示す例です。各クラスは非常に単純ですが、このような階層のおかげで、いくつかの複雑な操作を実行できます。 GalleryImage クラスのコンストラクターは、画像要素を作成します。クラス定義の残りの部分は、空の複合オブジェクト メソッド (これはリーフ ノードであるため) と、GalleryItem に必要な操作で構成されます。これで、これら 2 つのクラスを使用して画像を管理できるようになります:
var topGallery = new DynamicGallery('top-gallery');
topGallery.add(new GalleryImage('/img/image-1.jpg'));
topGallery.add(new GalleryImage('/) img/image-2.jpg'));
topGallery.add(new GalleryImage('/img/image-3.jpg'));
var valleyPhotos = new DyamicGallery('vacation-photos');
for(var i = 0, i valleyPhotos.add(new GalleryImage('/img/vac/image-' i '.jpg'));
}
topGallery.add(vacationPhotos);
topGallery.show();
vacationPhotos.hide();
組み合わせモードを使用すると、簡単な操作も可能です複雑な結果を生成します。配列やその他のデータ構造を手動で走査するグルー コードを記述する代わりに、最上位のオブジェクトに対して操作を実行し、その操作を各子オブジェクト自体に渡すだけで済みます。これは、繰り返し実行される操作に特に役立ちます。 Composite パターンでは、個々のオブジェクト間の結合は非常に緩やかです。最上位の複合オブジェクトに対して操作が実行されるたびに、ノードを見つけるために構造全体にわたって Try-First 検索が実行されます。
複合モードの欠点は、この階層が大きい場合、複合モードで呼び出される操作がすべてのサブオブジェクトに対して実行されることです。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック









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

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

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

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

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

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

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

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