デコレータパターンとは何ですか?
デコレーター パターンは、追加の動作をオブジェクトに動的に付加する構造設計パターンです。デコレータは、サブクラス化 (継承) ではなく合成によって柔軟な拡張理由を提供します。
いつ使用しますか?
実行時に小さな動作を追加してオブジェクトを構築したい場合は、Decorator パターンを使用します。
UML図
デコレータ クラスは合成と継承を使用するため、その意図を理解することが重要です。
Decorator パターンでは、コンポーネントとデコレータの両方に同じ型を使用します。 Decorator は Component オブジェクトを合成して動作を取得します。つまり、Component オブジェクトに定義されているフィールドまたはメソッドを取得します。 Decorator は Component を継承 (拡張) するため、Decorator オブジェクトを Component オブジェクトとして宣言できます。
デコレータ パターンは、オープン-クローズの原則、つまり、拡張のために開き、変更のために閉じられることを実現します。コンポーネントやデコレータを追加するのは簡単です。たとえば、別の具体的なデコレータを追加したい場合は、それを表すクラスを作成し、Decorator クラスを拡張するだけです。
例
アイスクリームショップ用のシステムを開発していると想像してください。店内には様々なアイスクリームやトッピングが揃っています。システムは、アイスクリームの説明 (トッピングを含む) と価格を表示する必要があります。
- コンポーネント (アイスクリーム) とデコレータ (トッピング) には共通のインターフェイス IceCream クラスがあり、両方とも IceCream オブジェクトとして宣言されます。
- それぞれの具体的なアイスクリームの価格は異なるため、原価計算方法は上書きされます。
- Topping クラスは、具体的なトッピングのインターフェイスを提供し、IceCream への参照を保持します。
- システムに別のトッピング、たとえばキャラメルソースが必要な場合は、Topping クラスを拡張する CaramelSource クラスを作成するだけです。
Javaでの実装
IceCream クラス:
// Component class public abstract class IceCream { public String description = "Unknown ice cream"; public String getDescription() { return description; } public abstract double cost(); }
チョコレートアイスクリームクラス:
// Concrete component class public class ChocolateIceCream extends IceCream { public ChocolateIceCream() { description = "ChocolateIceCream"; } @Override public double cost() { return 1.99; } }
トップクラス:
// Base decorator class public abstract class Topping extends IceCream { public IceCream iceCream; // All subclasses (concrete decorator classes) need to implement getDescription method, // by declaring this method as abstract, we enforce all subclasses to implement this method public abstract String getDescription(); }
MapleNuts クラス:
// Concrete decorator class public class MapleNuts extends Topping { public MapleNuts(IceCream iceCream) { this.iceCream = iceCream; } @Override public String getDescription() { return iceCream.getDescription() + ", MapleNuts"; } @Override public double cost() { return iceCream.cost() + .30; } }
PeanutButterShell クラス:
// Concrete decorator class public class PeanutButterShell extends Topping { public PeanutButterShell(IceCream iceCream) { this.iceCream = iceCream; } @Override public String getDescription() { return iceCream.getDescription() + ", PeanutButterShell"; } @Override public double cost() { return iceCream.cost() + .30; } }
クライアントクラス:
public class Client { public static void main(String[] args) { IceCream iceCream = new ChocolateIceCream(); System.out.println(iceCream.getDescription() + ", $" + iceCream.cost()); iceCream = new MapleNuts(iceCream); System.out.println(iceCream.getDescription() + ", $" + iceCream.cost()); iceCream = new PeanutButterShell(iceCream); System.out.println(iceCream.getDescription() + ", $" + iceCream.cost()); } }
出力:
ChocolateIceCream, .99 ChocolateIceCream, MapleNuts, .29 ChocolateIceCream, MapleNuts, PeanutButterShell, .59
ここですべてのデザインパターンの実装を確認できます。
GitHub リポジトリ
追記
技術ブログを書くのは初めてです。文章を改善するためのアドバイスや、わかりにくい点がある場合は、コメントを残してください。
読んでいただきありがとうございます:)
以上がデコレータパターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

javaachievesplatformentenceTheTheTheJavavirtualMachine(JVM)、CodetorunondifferentoperatingSystemswithOutModification.thejvmcompilesjavacodeplatform-IndopentedbyTecodeを承認することを許可します

javaispowerfulfulduetoitsplatformindepentence、object-orientednature、richstandardlibrary、performancecapability、andstrongsecurityfeatures.1)platformendependenceallowseplicationStorunonaydevicesupportingjava.2)オブジェクト指向のプログラマン型

上位のJava関数には、次のものが含まれます。1)オブジェクト指向プログラミング、サポートポリ型、コードの柔軟性と保守性の向上。 2)例外処理メカニズム、トライキャッチ式ブロックによるコードの堅牢性の向上。 3)ゴミ収集、メモリ管理の簡素化。 4)ジェネリック、タイプの安全性の向上。 5)コードをより簡潔で表現力豊かにするためのAMBDAの表現と機能的なプログラミング。 6)最適化されたデータ構造とアルゴリズムを提供するリッチ標準ライブラリ。

javaisnotentirelylylyplatformedent dueTojvmvariations andNativeCodeIntegration、ButlargelyHoldSitsworapromise.1)JavacompilestobyteCoderunbythejvm、Cross-Platformexecution.2を許可します

thejavavirtualmachine(jvm)isanabstractcomputingmachineculucialforjavaexecutionsiTrunsjavabytecode、「writeonce、runaynay "capability

JavaremainsagoodlanguagedueToitscontinuousevolution androbustecosystem.1)lambdaexpressionsenhancecodereadability andenableFunctionalprogramming.2)streamsalowsolowsolfisitydataprocessing、特に特にlagedatasets.3)硬化系系統系系統系系統系系統

Javaisgreatduetoitsplatformindependence、robustoopsupport、extensiveLibraries、andstrongCommunity.1)PlatformentepenteviajvMallowsCodeTorunonVariousPlatforms.2)oopeatureSlikeEncapsulation、遺伝、およびポリモ系系統型皮下皮質皮下Rich

Javaの5つの主要な特徴は、多型、Lambda Expressions、StreamSapi、ジェネリック、例外処理です。 1。多型により、さまざまなクラスのオブジェクトを一般的なベースクラスのオブジェクトとして使用できます。 2。Lambda式は、コードをより簡潔にし、特にコレクションやストリームの処理に適しています。 3.ストリームサピは、大規模なデータセットを効率的に処理し、宣言操作をサポートします。 4.ジェネリックは、タイプの安全性と再利用性を提供し、型刻印中にタイプエラーがキャッチされます。 5.例外処理は、エラーをエレガントに処理し、信頼できるソフトウェアを作成するのに役立ちます。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

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

WebStorm Mac版
便利なJavaScript開発ツール

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

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。
