Heim  >  Artikel  >  Java  >  Beherrschen Sie ganz einfach das Java-Decorator-Muster

Beherrschen Sie ganz einfach das Java-Decorator-Muster

高洛峰
高洛峰Original
2017-01-19 16:02:531092Durchsuche

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

Funktionen:

(1) Dekorierte Objekte haben die gleiche Schnittstelle wie echte Objekte. Auf diese Weise kann das Client-Objekt mit dem dekorierten Objekt auf die gleiche Weise interagieren wie ein reales Objekt.

(2) Das dekorierte Objekt enthält einen Verweis auf ein reales Objekt

(3) Das dekorierte Objekt akzeptiert alle Anfragen des Kunden. Es leitet diese Anfragen an die realen Objekte weiter.

(4) Dekorationsobjekte können vor oder nach der Weiterleitung dieser Anfragen einige 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.

Entwicklung und Anwendungen auf Unternehmensebene in gemeinsamen Frameworks: zugrunde liegende Architektur des E/A-Streams

Zusammensetzung:

(1) Rolle der abstrakten Komponente (Komponente): Geben Sie eine abstrakte Schnittstelle an und bereiten Sie sie vor Objekte mit Spezifikationen, um zusätzliche Verantwortlichkeiten zu erhalten.
(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.

Konkretes Beispiel:

/**
 * 以下装饰房子举例
 */
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("具体装饰角色:在这儿做装饰的事儿,把房子中的一间装饰成厨房,所以房子可以做饭了");
 }
}

In der tatsächlichen Entwicklung spielt die mit Mustern verzierte Verpackungsfunktion eine große Rolle. Wir können einige Dinge am Objekt vornehmen, ohne das Originalobjekt zu verändern hindern uns daran, Objekte zu transformieren, können aber gleichzeitig einige Vorgänge gut abschließen.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.

Weitere Artikel zur einfachen Beherrschung des Java-Decorator-Musters finden Sie auf der chinesischen PHP-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