ホームページ Java &#&チュートリアル Java デザイン パターン プログラミングにおける Decorator パターンの使用を説明する例

Java デザイン パターン プログラミングにおける Decorator パターンの使用を説明する例

Jan 19, 2017 pm 03:53 PM

コンセプト

デコレーター パターンは、オブジェクトに責任を動的に割り当てます。機能を拡張するために、デコレータは継承に代わるより柔軟な手段を提供します。

Java デザイン パターン プログラミングにおける Decorator パターンの使用を説明する例


デコレーターと装飾されたオブジェクトは同じスーパータイプを持ちます。
オブジェクトを 1 つ以上のデコレータでラップできます。
デコレーターと装飾されたオブジェクトは同じスーパータイプを持つため、元のオブジェクト (ラップされた) が必要なときはいつでも、代わりに装飾されたオブジェクトを使用できます。
デコレーターは、特定の目的を達成するために、委任されたデコレーターの動作の前または後に独自の動作を追加できます。
オブジェクトはいつでも装飾できるため、実行時にお気に入りのデコレータを使用して
オブジェクトを動的かつ無制限に装飾できます。

Java では、io パッケージの下にある多くのクラスは、次のような典型的なデコレータ パターンを具体化したものです:

new BufferedOutputStream(OutputStream out)

new BufferedInputStream(InputStream in);

new PrintWriter(OutputStream out)

new FilterReader(Reader in);

装飾されたクラスは、装飾されたクラスと同じインターフェイスを実装します。
装飾されたクラスは、どの実装クラスが装飾するかを気にしません。
同じビジネスメソッドであるため、装飾されたクラスは、装飾されたクラスのメソッドを呼び出して拡張します。装飾クラスの機能

インスタンス:
クラス図

Java デザイン パターン プログラミングにおける Decorator パターンの使用を説明する例

public interface IReader { 
  void read(); 
} 
 
public class Reader implements IReader { 
  
  @Override
  public void read() { 
    System.out.println("read of Reader"); 
  } 
  
} 
 
public class BufferedReader implements IReader { 
    
  private IReader mReader; 
  public BufferedReader(IReader reader) { 
    this.mReader = reader; 
  } 
    
  @Override
  public void read() { 
    System.out.println("read of BufferedReader"); 
    mReader.read(); 
  } 
  
} 
 
public class Test { 
  public static void main(String[] args) { 
    Reader reader = new Reader(); 
    reader.read(); 
    System.out.println("----------"); 
    BufferedReader bufferedReader = new BufferedReader(reader); 
    bufferedReader.read(); 
  
  } 
}
ログイン後にコピー

特徴:
1. 装飾されたオブジェクトと実際のオブジェクトは同じインターフェイスを持ちます。このようにして、クライアント オブジェクトは、実際のオブジェクトと同じ方法で装飾されたオブジェクトと対話できます。
2. 装飾されたオブジェクトには、実際のオブジェクトへの参照が含まれています。
3. 装飾されたオブジェクトは、クライアントからのすべてのリクエストを受け入れます。これらのリクエストを実際のオブジェクトに転送します。
4. 装飾オブジェクトは、これらのリクエストを転送する前または後に、いくつかの追加機能を追加できます。これにより、特定のオブジェクトの構造を変更することなく、実行時に追加の機能を外部から追加できるようになります。
オブジェクト指向設計では、通常、特定のクラスの機能拡張は継承によって実現されます。装飾後、実物を保持して機能性を高めます。

デコレーター パターンとアダプター パターンの違い:
新しい責任について: アダプターは変換中に新しい責任を追加することもできますが、主な目的はここではありません。デコレータ パターンは主に、デコレータに新しい責任を追加します。
ラップするオブジェクトについて: アダプターは、適応される人の詳細 (つまり、適応クラス) を知っています。デコレータはそのインターフェイスが何であるかのみを知り、その特定の型 (基底クラスであるか別の派生クラスであるか) は実行時にのみわかります。

Java デザイン パターン プログラミングにおける Decorator パターンの適用を説明するその他の例については、PHP 中国語 Web サイトの関連記事に注目してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか? Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか? Mar 17, 2025 pm 05:35 PM

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか? カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか? Mar 17, 2025 pm 05:44 PM

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか? キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか? Mar 17, 2025 pm 05:43 PM

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか? 高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか? Mar 17, 2025 pm 05:46 PM

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか? 適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか? Mar 17, 2025 pm 05:45 PM

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

See all articles