Heim  >  Artikel  >  Java  >  Ausführliche Erläuterung von Beispielen für Dekoratormuster in Java

Ausführliche Erläuterung von Beispielen für Dekoratormuster in Java

黄舟
黄舟Original
2017-09-05 10:27:311477Durchsuche

Dieser Artikel stellt hauptsächlich das Java-Dekoratormuster vor und analysiert die Prinzipien des Dekoratormusters und Java-spezifische Implementierungstechniken im Detail in Form von Beispielen

Dieser Artikel beschreibt das Java-Dekorator mit Beispielen. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Dekorationsmodus

Dynamisch, ohne die ursprüngliche Klassendatei zu ändern und Vererbung zu verwenden um die Funktionalität eines Objekts zu erweitern. Es umhüllt das reale Objekt, indem es ein Verpackungsobjekt, also eine Dekoration, erstellt.

Das Dekorationsobjekt nimmt alle Wünsche des Kunden entgegen. Es leitet diese Anfragen an die realen Objekte weiter. Dekorierte Objekte können vor oder nach der Weiterleitung dieser Anfragen zusätzliche Funktionen hinzufügen.

Dadurch wird sichergestellt, dass zusätzliche Funktionalität zur Laufzeit extern hinzugefügt werden kann, ohne die Struktur eines bestimmten Objekts zu ändern. Beim objektorientierten Design wird die funktionale Erweiterung einer bestimmten Klasse normalerweise durch Vererbung implementiert.

Vorteile

1. Der Decorator-Modus und die Vererbung dienen beide dazu, die Funktionalität von Objekten zu erweitern, aber der Decorator bietet eine bessere Leistung als die Vererbung. Mehr Flexibilität.

2. Durch die Verwendung verschiedener spezifischer Dekorationsklassen und die Anordnung und Kombination dieser Dekorationsklassen können Designer viele Kombinationen unterschiedlicher Verhaltensweisen erstellen.

Rolle

Die verschiedenen Rollen im Dekorationsmodus sind:

(1) Rolle der abstrakten Komponente (Komponente): Geben Sie eine abstrakte Schnittstelle und bereiten Sie Objekte vor mit Vorgaben zur Übernahme zusätzlicher Verantwortlichkeiten.
(2) Rolle der konkreten Komponente: Definieren Sie eine Klasse, die zusätzliche Verantwortlichkeiten erhält.
(3) Dekorateurrolle: Enthält eine Instanz eines Komponentenobjekts und implementiert eine Schnittstelle, die mit der abstrakten Komponentenschnittstelle konsistent ist.
(4) Rolle des Betondekorateurs: Verantwortlich für das Hinzufügen zusätzlicher Verantwortlichkeiten zu Komponentenobjekten.

Beispielcode

Nehmen wir einen Handkuchen als Beispiel, aber der einfachste ist ein origineller Handkuchen , wir können eine oder mehrere Kombinationen wie Eier, Rindfleisch, Filet usw. hinzufügen.

Abstrakte Komponente-Rolle


package 装饰者模式;
/**
 * 抽象类接口,规范饼的属性
 * @author oooo
 *
 */
public interface Cake {
//两个属性
  public String descripestion();
//属性描述
  public Double money();
//价格描述
}

Betonkomponente-Rolle


package 装饰者模式;
/**
 * 原味手抓饼类
 * @author oooo
 *负责接收附加属性的类
 */
public class shreddedcake implements Cake{
//实现Cake接口
  @Override
  public String descripestion() {
    //描述属性
    return "原味手抓饼";
  }
  @Override
  public Double money() {
     //描述价格
    return 3.5;
  }
}

Dekorateur-Rolle


package 装饰者模式;
/**
 * 建立和饼的连接,得到原始饼的属性,添加属性的中介。
 * @author oooo
 *
 */
public abstract class Deractor implements Cake{
  Cake cake;
  public Deractor(Cake cake) {
    this.cake=cake;
  }
  public String descripestion(){
    return cake.descripestion();
  }
  public Double money(){
    return cake.money();
  }
}

Betondekorateurrolle


package 装饰者模式;
/**
 * 鸡蛋手抓饼类
 * @author oooo
 *添加鸡蛋属性
 */
public class EggshrededCake extends Deractor{
  public EggshrededCake(Cake cake) {
    super(cake);
  }
  public String descripestion() {
    return "鸡蛋"+cake.descripestion();
  }
  @Override
  public Double money() {
    return 3.5+1.5;
  }
}

Betondekorateurrolle


package 装饰者模式;
/**
 * 牛肉味手抓饼
 * @author oooo
 *添加牛肉属性
 */
public class beffshredded extends Deractor{
  public beffshredded(Cake cake) {
    super(cake);
    // TODO Auto-generated constructor stub
  }
  public String descripestion() {
    return "牛肉"+cake.descripestion();
  }
  @Override
  public Double money() {
    return cake.money()+3.0;
  }
}

Testklasse


package 装饰者模式;
public class Test {
  /**
   * 测试类
   * @param args
   */
  public static void main(String[] args) {
    //新建一个原味手抓饼类
    shreddedcake sh=new shreddedcake();
    System.out.println(sh.descripestion());
    System.out.print("  价格: "+sh.money());
    //新建一个鸡蛋类,附加鸡蛋属性到手抓饼上
    EggshrededCake egg=new EggshrededCake(sh);
    System.out.println(egg.descripestion());
    System.out.print("  价格:"+egg.money());
    //新建一个牛肉类,附加牛肉属性到手抓饼上
    beffshredded beff=new beffshredded(egg);
    System.out.println(beff.descripestion());
    System.out.print("  价格:"+beff.money());
  }
}

Ausgabe Ergebnis:


原味手抓饼  价格: 3.5
鸡蛋原味手抓饼  价格:5.0
牛肉鸡蛋原味手抓饼  价格:8.0

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Beispielen für Dekoratormuster in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn