装飾図案
14492 ワード
緒論
装飾師の意味は装飾、装飾です.
したがって、Pythonは関数を実行する前に使用できるように修飾します.
まったく違うが意味が近いJavaを使って装飾図案を持っている.
例えば,カーナビに道路を表示する機能(カメラ位置,速度制限の取り締まり)を考える.
public class RoadDisplay {
public void draw() { System.out.println("기본 도로 표시"); }
}
ユーザーが車線を表示したい場合、機能を開きたい場合はどうすればいいですか?public class RoadDisplayWithLane extends RoadDisplay {
public void draw() {
super.draw();
drawLane();
}
private void drawLane() {
System.out.println("차선 표시");
}
}
RoadDisplay
を継承して車線表示機能を追加できます.しかし周囲の交通量を観察するために機能を増やせば
また、
RoadDisplay
を継承して新しいクラスを作成する必要があります.これにより、必要なすべての機能のすべての組合せのクラスを作成する必要があるという問題が発生します.
これらの不要なコードを除去するために,デコーダモードが現れた.
本題
これらのプロパティの共通点は、表示に表示されます.
public abstract class Display {
public abstract void draw();
}
このクラスを抽象クラスにする.最も基本的な機能を記述する抽象クラスを
Component
と呼ぶ.「構成部品」(Component)とは、プログラミングで再利用可能な各独立したモジュールを指す。
このコンポーネントを実装するエンティティを示します.
public class RoadDisplay extends Display{
@Override
public void draw() {
System.out.println("기본 도로 표시");
}
}
以上のキャラクター名はConcreteComponent
です.実際の実施者.
コンテンツコンポーネント:独立モジュールの実装
次に、Decoratorを修飾ロールに関連付けるクラスを作成します.
package decorator;
public class DisplayDecorator extends Display{
private Display decoratedDisplay;
public DisplayDecorator(Display decoratedDisplay) {
this.decoratedDisplay = decoratedDisplay;
}
@Override
public void draw() {
this.decoratedDisplay.draw();
}
}
最上位表示をsetterとして注入し、正確には受信した表示(抽象)が表示の実装をインポートして関数を実行する.オブジェクトを注入し、注入オブジェクトの関数を呼び出すことが重要です.
上記のように、
Decorator
と呼ばれています.次に、ユーザが車線を表示したい上記の例を使用します.
public class LaneDecorator extends DisplayDecorator{
public LaneDecorator(Display decoratedDisplay) {
super(decoratedDisplay);
}
@Override
public void draw() {
super.draw();
drawLane();
}
private void drawLane() {
System.out.println("차선표시");
}
}
継承ジェネレータのDisplayDecorator
ジェネレータを呼び出してオブジェクトを注入します.独自のdraw()を再定義して独自の論理を追加すればよい.
これは
ConcreteDecorator
と呼ばれています. public void draw()
のsuper.draw()
前後の関数を装飾(装飾)するために、さらに独自の作業を実施することができます.なぜ今
Decorate
が貼られているのか理解できますか?クライアント呼び出しを記述するコードはこうです.
Display roadWithLine = new LaneDecorator(new RoadDisplay());
roadWithLine.draw();
// 기본 도로 표시
// 차선표시
上記のトラフィック機能を追加したい場合は、どうなりますか?public class TrafficDecorator extends DisplayDecorator{
public TrafficDecorator(Display decoratedDisplay) {
super(decoratedDisplay);
}
@Override
public void draw() {
super.draw();
drawTraffic();
}
private void drawTraffic() {
System.out.println("트래픽그리기");
}
}
前述のように、ConcreteDecorator
のキャラクターを追加すればよい.合計3つの機能のトラフィックを表示し、デフォルトの道路を表示し、車線を表示する機能を呼び出すには、次の手順に従います.
Display trafficRoadWithLine = new TrafficDecorator(new LaneDecorator(new RoadDisplay()));
trafficRoadWithLine.draw();
//기본 도로 표시
//차선표시
//트래픽그리기
これにより、複数の組合せクラスを作成する必要がなくなり、Decoratorはコードの無駄を減らし、より読み取り可能なコードを使用することができます.整理する
Component
ConcreteComponent
Decorator
ConcreteDecorator
Reference
この問題について(装飾図案), 我々は、より多くの情報をここで見つけました https://velog.io/@uhs2000/데코레이터-패턴テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol