記事のディレクトリ
I. Decoratorパターンのコンセプト
Decoratorパターンの概念:
①デザインパターンの種類: 構造化。
②コンセプトは: 動的オブジェクトに追加機能を添付し、オブジェクトの既存のクラスを変更しません。
③拡張オブジェクトの特徴: クラスより継承し、この機能を拡張するために、より柔軟な方法を。
④Decoratorパターン: 削除クラスは、コアの責任と装飾機能の簡略化され、地域の分類のように飾られる装飾的な特徴です。
II。適用シーンDecoratorパターン
Decoratorパターン該当シーン:
①拡張子: クラス拡張、追加の責任を追加するために、(拡張子を重視)
②動的アンドゥ機能を追加し たオブジェクトを動的に追加機能を追加すると、これらの機能を動的に取り消す添加することができるが、(ハイライト)
III。利点とDecoratorパターンの欠点
Decoratorパターンの利点:
①拡張の柔軟性: Decoratorパターンを使用することは、継承よりも柔軟であり、クラス機能を拡張Decoratorパターンを使用して、元のクラスを変更しません。
②置換: 装飾種々の順列及び組合せのために、異なる拡張子を実施することができます。
③原則としてクローズ: お互いを乱すことなく、デコレータパターン一致閉鎖原則、装飾されたクラス、そしてお互いの装飾の独立したが、
Decoratorパターンの短所:
①複雑な手順: 複数のクラスを生成するために、より多くのコードを記述する必要があり、プログラムの複雑さを増します。
②ダイナミック/多層装飾: ダイナミック/多層装飾クラス、より複雑な手続き。
IV。Decoratorパターンと継承のコントラスト
継承とDecoratorパターンの比較:
複合①継承: 継承拡張を使用するサブカテゴリ、システムの複雑さが増加の多くを生成する必要があります。
②静的継承: 継承は、コンパイル時に機能の拡張を決定するには、静的です。
③デコレータの動的拡張: Decoratorパターンを動的機能を実行時コードを拡張することができ、機能を拡張することができます。
V. Decoratorパターンに関連するデザインパターン
1.デコレータモードとプロキシモード:
キー①注: 動的な拡張のデコレータフォーカス、代理店モデルはオブジェクトへのアクセスを制御するに焦点を当て、ユーザーの詳細を隠すためにプロキシクラス。
②使用してオブジェクトの例: Decoratorパターン元のオブジェクトをコンストラクタデコレータのパラメータとして、プロキシクラスで作成されたオブジェクトのプロキシ・モードインスタンス。
2. Decoratorパターンアダプタモード: 両方のモードをラップしています。
Decoratorパターン①: Decoratorパターンと同じインタフェースを実装装飾デコレータ、またはデコレータはデコレータのサブクラスです。
アダプタモード②: アダプタモード、アダプタと適合クラスは、いくつかの重複インターフェースがあってもよい、異なるインターフェースを有します。
VI。デコレーター4クラス
4つのカテゴリに関連Decoratorパターン:
① 抽象クラスで飾ら: これは、コアである、後者の3つのクラスがこのクラスを継承する必要があります。
デコレータクラス②実体: Decoratorパターンの定義、クライアントのみが初期化されたユーザーを呼び出したときよりも少ないです。
③抽象デコレータ: すべての親クラスのデコレータは、抽象クラスはデコレータで拡張する必要があります。(クラスオプションで、必須ではありません)
デコレータ④実体: 抽象クラスのデコレータを継承するが、そのクラスにデコレータ抽象クラスのオブジェクトを保持し、それが実体デコレータのコンストラクタ、通過させ、抽象デコレータその実装方法、必要方法は、追加操作に対応する着呼エンティティ・オブジェクト。
VII。Decoratorパターンデコレータエンティティの動作機構
デコレータークラスの操作機構の実体:
①コア: コアがあるの抽象デコレータクラスの タイプ、
②デコレータタイプ: デコレータの実体がある抽象クラスによって装飾 タイプ、
③変数タイプデコレータが維持さ: 実施例メンバー変数がどの維持される抽象デコレータのある タイプ、
④デコレータモード: 作成するために使用されるデコレータパターンの抽象デコレータクラス 、インスタンスオブジェクトをDecoratorパターンに渡されたオブジェクトのインスタンス上記コンストラクタによってデコレータオブジェクトを作成し、オブジェクトのインスタンス全体のためのものですこれは、延長されます。
装飾は、ネストされたループすることができ⑤: エンティティのタイプは、装飾的です抽象的なデコレータで 飾られた後、またはタイプ抽象デコレータで 、タイプそして、また再び装飾的実体を装飾することができます拡張動的関数は無限に装飾を拡張することができます。
フロー(フォーカス)を使用して定義VIII。Decoratorパターン
装飾される1つの定義する抽象: の定義抽象クラスデコレータによって 、抽象メソッドを拡張する方法として定義されます。
2(抽象)デコレータを定義します。
①継承された 抽象クラスによって装飾 :デコレータクラス 継承抽象はデコレータのクラスです。
②メンテナンスは 抽象クラスで飾ら メンバー:内のクラスを維持する抽象デコレータのクラスである オブジェクト、コンストラクタを介して渡されたオブジェクト。
③デリゲート抽象メソッドを実装: 抽象メソッドデコレータを、あなたはクラスを委任する必要が維持抽象的なことはデコレータである オブジェクト、抽象メソッドの実装は、上記のオブジェクトの対応するメソッドを呼び出し、その後、拡張への追加します符号、拡散符号は、オブジェクトデコレータのビットパターンは、動的機能拡張です。
図3は、エンティティ・オブジェクトを定義する: オブジェクトであるの抽象デコレータの 、エンティティの特定の機能は、実際のコード・ロジック・チャンク、すべての操作を達成するためにタイプ、装飾、エンティティ・オブジェクト・クラスに基づいています。
デコレータ上記装飾するための唯一の方法は、当該 他のコンテンツを定義していないが、。
4 Decoratorパターンを使用します。
①作成の抽象デコレータクラスのエンティティオブジェクトを、
②装飾的なエンティティ・オブジェクト・クラス:作成の抽象デコレータクラス で作成①渡し、コンストラクタで、デコレータクラスの種類を抽象することはデコレータのクラスである エンティティオブジェクトのタイプ。
③再度装飾オブジェクト・クラス・エンティティ: 再作成の抽象デコレータクラス 通過②のコンストラクタで作成され、デコレータクラスのタイプ要約はデコレータのクラスであり 、従って両者を達成する、デコレータ固体オブジェクトの種類装飾回;
使用して、オブジェクトタイプ抽象がデコレータで 、デコレータが経過し、パッケージング、オブジェクト型または層に相当し、物体を装飾するために抽象的であるデコレータ 、この装飾的な包装はネストされたループであってもよいです。
IX。Decoratorパターンケース
1.ケースの要件:
①エンティティクラスオブジェクト: 新しく、デフォルトの公立大学の学習コースの学生が参加し、
②装飾品: あなたはコンピュータサイエンスの学生ですが、また、コンピュータサイエンスのコースを学ぶことを続ける場合は、
③装飾品: 音楽専攻の場合、音楽のコースを勉強し続ける必要性、
④二次装飾品は: あなたが最初のコンピュータを学び、その後、音楽に特化している場合は、コンピュータサイエンスコース、プロコースや学習音楽を学ぶ必要があります。
図2は、抽象デコレータクラスです: 抽象クラスの生徒、コンピュータ科学の学生のデコレータ、このクラスを継承している飾る音楽学生の背後にあります。
package kim.hsl.design.decorator;
/**
* 装饰者
* 抽象的装饰者
* 该类也继承 被装饰者 的抽象类
*/
public abstract class AbstractDecorator extends AbstractStudent {
//声明抽象的被装饰者, 通过构造器将其类型 ( 或子类类型 ) 对象传入 , 注入实体类
private AbstractStudent abstractStudent;
public AbstractDecorator(AbstractStudent abstractStudent) {
this.abstractStudent = abstractStudent;
}
/*
调用实现的两个 抽象装饰者 方法
实际上委托给了注入的 抽象装饰者 类型的对象执行的
抽象装饰者 类型的对象是其子类对象
*/
@Override
protected String studyCourses() {
return this.abstractStudent.studyCourses();
}
}
図3は、新たにクラスで学生を入学: これは最も一般的な実体である、エンティティクラスが飾られ、装飾は、すべてのエンティティの周りされています。
package kim.hsl.design.decorator;
/**
* 被装饰对象
* 确定的实体类
*/
public class Student extends AbstractStudent {
@Override
protected String studyCourses() {
return "学习大学公共课";
}
}
図4は、デコレータ要約である: このクラスは抽象クラスはデコレータのAbstractStudentのサブクラスであり、クラスのメンバ変数AbstractStudent、コンストラクタの初期化が維持される。studyCoursesれるプロセスメンバ変数を委任する必要abstractStudent abstractStudent方法;
package kim.hsl.design.decorator;
/**
* 装饰者
* 抽象的装饰者
* 该类也继承 被装饰者 的抽象类
*/
public abstract class AbstractDecorator extends AbstractStudent {
//声明抽象的被装饰者, 通过构造器将其类型 ( 或子类类型 ) 对象传入 , 注入实体类
private AbstractStudent abstractStudent;
public AbstractDecorator(AbstractStudent abstractStudent) {
this.abstractStudent = abstractStudent;
}
/*
调用实现的两个 抽象装饰者 方法
实际上委托给了注入的 抽象装饰者 类型的对象执行的
抽象装饰者 类型的对象是其子类对象
*/
@Override
protected String studyCourses() {
return this.abstractStudent.studyCourses();
}
}
5人のコンピュータサイエンスの学生デコレータ: 着信AbstractStudentメンバ変数、studyCourses方法、研究(委託メンバ変数)の公共のコースに基づいて、だけでなく、コンピュータサイエンスのコースを学習。
package kim.hsl.design.decorator;
/**
* 实体装饰者类
* 必须实现其带参数的构造器
*/
public class ComputerStudentDecorator extends AbstractDecorator {
public ComputerStudentDecorator(AbstractStudent abstractStudent) {
super(abstractStudent);
}
@Override
protected String studyCourses() {
return super.studyCourses() + " , 学习计算机专业课程";
}
}
6曲の学生デコレータ:
package kim.hsl.design.decorator;
public class MusicStudentDecorator extends AbstractDecorator {
public MusicStudentDecorator(AbstractStudent abstractStudent) {
super(abstractStudent);
}
@Override
protected String studyCourses() {
return super.studyCourses() + " , 学习音乐专业课程";
}
}
7.テストDecoratorパターン:、エンティティクラスは、コンピュータ科学の学生で装飾されて何の飾りを、持っていない、それは音楽の学生が飾られているテスト装飾音楽専攻の学生にコンピュータの電源を入れます。
package kim.hsl.design.decorator;
public class Main {
public static void main(String[] args) {
//刚入学的学生
Student student = new Student();
System.out.println(student.studyCourses());
//大二学习计算机专业课程
AbstractStudent computerStudent = new ComputerStudentDecorator(student);
System.out.println(computerStudent.studyCourses());
//大二学习音乐专业课程
AbstractStudent musicStudent = new MusicStudentDecorator(student);
System.out.println(musicStudent.studyCourses());
//先学计算机 , 专修音乐的学生
AbstractStudent computerMusicStudent = new ComputerStudentDecorator(computerStudent);
System.out.println(computerMusicStudent.studyCourses());
}
}