Java デコレータ パターンを簡単にマスターする

高洛峰
リリース: 2017-01-19 16:02:53
オリジナル
1092 人が閲覧しました

定義: 元のクラスファイルを変更したり継承を使用したりせずに、オブジェクトの機能を動的に拡張します。ラッピングオブジェクト、つまり装飾を作成することで、実際のオブジェクトをラッピングします。

特徴:

(1) 装飾されたオブジェクトは、実際のオブジェクトと同じインターフェースを持ちます。このようにして、クライアント オブジェクトは、実際のオブジェクトと同じ方法で装飾されたオブジェクトと対話できます。

(2) 装飾オブジェクトには実際のオブジェクトへの参照が含まれています

(3) 装飾オブジェクトはクライアントからのすべてのリクエストを受け入れます。これらのリクエストを実際のオブジェクトに転送します。

(4) 装飾オブジェクトは、これらのリクエストを転送する前または後に、いくつかの追加機能を追加できます。これにより、特定のオブジェクトの構造を変更することなく、実行時に追加の機能を外部から追加できるようになります。オブジェクト指向設計では、通常、特定のクラスの機能拡張は継承を通じて実装されます。エンタープライズレベルの開発と一般的に使用されるフレームワークの適用: IO 最下層アーキテクチャ

構成:

(1) 抽象コンポーネント (Component) の役割: 追加の規制義務を受け取るオブジェクトを規制するための抽象インターフェイスを提供します。

(2) 具体的なコンポーネントの役割: 追加の責任を受けるクラスを定義します。

(3) Decorator ロール: コンポーネント オブジェクトのインスタンスを保持し、抽象コンポーネント インターフェイスと一致するインターフェイスを実装します。
(4) Concrete Decorator ロール: コンポーネント オブジェクトに追加の責任を追加する責任を負います。

具体的な例:

/**
 * 以下装饰房子举例
 */
public class Demo {
 
 public static void main(String[] args) {
 GenericHouse house = new GenericHouse();
 Garage garage = new Garage(house);
 garage.doSomething();
 Kitchen kitchen = new Kitchen(house);
 kitchen.doSomething();
 }
}
 
/**
 * 抽象构件角色:一个接口,用以规范具体装饰的位置 
 */
interface AbstractHouse{
 public void doSomething();
}
 
/**
 * 装饰角色: 持有要装饰的对象
 */
class Master implements AbstractHouse{
  
 private AbstractHouse abstractHouse;
 
 public Master(AbstractHouse abstractHouse) {
 this.abstractHouse = abstractHouse;
 }
  
 public void doSomething() {
 System.out.println("装饰角色:装饰角色持有者,在这儿就是房子的主人");
 abstractHouse.doSomething();
 }
  
}
 
/**
 * 具体的构件角色:具体需要被装饰的对象 
 */
class GenericHouse implements AbstractHouse{
 public void doSomething() {
 System.out.println("具体构建角色:房子可以住人,遮风挡雨!");
 }
}
 
/**
 * 具体装饰角色: 具体的装饰就是在这儿做的,它继承自装饰角色,因为装饰角色持有被装饰对象,
 * 所以它也就持有了被装饰对象,可以做装饰
 */
class Garage extends Master{
 
 public Garage(AbstractHouse abstractHouse) {
 super(abstractHouse);
 }
  
 public void doSomething() {
 super.doSomething();
 System.out.println("具体装饰角色:在这儿做装饰的事儿,把房子中的一间装饰成车库,所以房子可以存放车子了");
 }
}
/**
 * 具体装饰角色: 具体的装饰就是在这儿做的,它继承自装饰角色,因为装饰角色持有被装饰对象,
 * 所以它也就持有了被装饰对象,可以做装饰
 */
class Kitchen extends Master{
 
 public Kitchen(AbstractHouse abstractHouse) {
 super(abstractHouse);
 }
  
 public void doSomething() {
 super.doSomething();
 System.out.println("具体装饰角色:在这儿做装饰的事儿,把房子中的一间装饰成厨房,所以房子可以做饭了");
 }
}
ログイン後にコピー

実際の開発では、パターンで装飾されたパッケージ化関数が大きな役割を果たします。これにより、元のオブジェクトを変更せずに、オブジェクトに対して他の操作を行うことができます。同時に、いくつかの操作を非常にうまく完了できます。

以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。また、皆さんも PHP 中国語 Web サイトをサポートしていただければ幸いです。

Java デコレータ パターンを簡単にマスターすることに関するその他の記事については、PHP 中国語 Web サイトに注目してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!