Heim  >  Artikel  >  Java  >  Einführung in Appearance Pattern und Decorator Pattern in Java Design Patterns (Codebeispiel)

Einführung in Appearance Pattern und Decorator Pattern in Java Design Patterns (Codebeispiel)

不言
不言Original
2018-09-12 16:06:231934Durchsuche

Dieser Artikel bietet Ihnen eine Einführung in den Darstellungsmodus und den Dekorationsmodus in Java-Designmustern. Ich hoffe, er wird Ihnen als Referenz dienen.

Vorwort

Im vorherigen Artikel haben wir etwas über den Adaptermodus und den Bridge-Modus des Strukturmodus gelernt. In diesem Artikel lernen wir den Erscheinungsmodus und den Dekorationsmodus des Strukturmodus kennen.

Fassadenmodus

Einführung

Der Fassadenmodus verbirgt die Komplexität des Systems und stellt dem Kunden eine Schnittstelle zur Verfügung, über die der Kunde auf das System zugreifen kann . Bei dieser Art von Entwurfsmuster handelt es sich um ein Strukturmuster, das einem vorhandenen System eine Schnittstelle hinzufügt, um die Komplexität des Systems zu verbergen.

Einfach ausgedrückt stellt es eine einfache Schnittstelle zur Außenwelt bereit und verbirgt die Implementierungslogik. Mit dem Netzschalter eines häufig verwendeten Computers müssen wir beispielsweise nur den Netzschalter drücken, um ihn zu starten oder herunterzufahren. Wir müssen nicht wissen, wie er gestartet wird (Starten der CPU, Starten des Speichers, Starten der Festplatte). Festplatte) oder wie man herunterfährt (Ausschalten der Festplatte, Ausschalten des Speichers usw.);

Hier können wir noch das Beispiel des Spielens auf einem Computer verwenden, um Darstellungsmodus für eine einfache Erklärung.
Es gibt einige Online-Spiele auf dem Computer, darunter DNF, LOL und WOW. Wir müssen nur auf das Symbol auf dem Computer doppelklicken, um das Spiel zu starten und zu spielen läuft.

Die Schritte, die implementiert werden müssen, sind wie folgt:

  1. Richten Sie die Spieloberfläche ein;

  2. Richten Sie die Klassen ein LOL, DNF und WOW implementieren die Spielschnittstelle;

  3. definieren eine vom Client aufzurufende Erscheinungsklasse.

  4. Rufen Sie den Auftrittskurs an.

Codebeispiel:

interface Game{
    void play();
}

class DNF implements Game{

    @Override
    public void play() {
        System.out.println("正在玩DNF...");
    }
}

class LOL implements Game{
    @Override
    public void play() {
        System.out.println("正在玩LOL...");
    }
}

class WOW implements Game{
    @Override
    public void play() {
        System.out.println("正在玩WOW...");
    }
}

class Computer{
    
    private Game dnf;
    private Game lol;
    private Game wow;
    
    public Computer() {
        dnf=new DNF();
        lol=new LOL();
        wow=new WOW();
    }
    
    public void playDNF(){
        dnf.play();
    }
    
    public void playLOL(){
        lol.play();
    }
    
    public void playWOW(){
        wow.play();
    }   
}

public static void main(String[] args) {
        Computer computer=new Computer();
        computer.playDNF();
        computer.playLOL();
        computer.playWOW();
    }

Ergebnis ausführen:

    正在玩DNF...
    正在玩LOL...
    正在玩WOW...

Im obigen Codebeispiel: Wenn wir ein Spiel spielen möchten, müssen wir nur die Appearance Class instanziieren und darin die Spielmethode aufrufen, ohne uns darum zu kümmern, wie das Spiel startet und läuft. Darüber hinaus sind die einzelnen Spiele unabhängig voneinander und beeinflussen sich nicht gegenseitig. Nur weil ein Spiel nicht gespielt werden kann, können auch andere Spiele nicht ausgeführt werden. Tatsächlich fühlt sich der Darstellungsmodus der von uns normalerweise verwendeten Schnittstelle sehr ähnlich. Beide stellen Schnittstellen zur Außenwelt bereit, und es besteht kein Grund, sich darum zu kümmern, wie sie implementiert werden.

Vorteile des Darstellungsmodus:

Reduziert die Kopplung, was in gewisser Weise auch die Sicherheit verbessert.

Nachteile des Erscheinungsmodus:

Entspricht nicht dem Öffnungs- und Schließprinzip und ist nicht einfach zu ändern.

Nutzungsszenarien

Wenn im System mehrere komplexe Module oder Subsysteme vorhanden sind.

Decorator-Muster

Einführung

Das Decorator-Muster ermöglicht das Hinzufügen neuer Funktionen zu einem vorhandenen Objekt, ohne seine Struktur zu ändern. Bei dieser Art von Entwurfsmuster handelt es sich um ein Strukturmuster, das als Hülle um eine vorhandene Klasse fungiert.

Der Dekorationsmodus besteht, wie der Name schon sagt, darin, etwas zu dekorieren, damit es einige zusätzliche Funktionen bieten kann. Zum Beispiel Menschen schmücken und unterschiedliche Kostüme tragen, wenn man unterschiedliche Dinge tut. Zum Beispiel bedeutet das Anziehen eines Trikots, dass man sich zum Ballspielen bereit macht, das Anziehen eines Badeanzugs bedeutet, dass man sich zum Schwimmen bereit macht usw.

Das Dekoratormuster kann einem Objekt dynamisch einige zusätzliche Verantwortlichkeiten hinzufügen.

Hier verwenden wir noch ein Beispiel zur Veranschaulichung.
Unter den aktuellen Spielzeugmodellen gibt es zwei sehr beliebte Modelle, GUNDAM-Modell und MrGu-Modell. Wenn wir die Modelle zusammenbauen, wird im Allgemeinen zuerst das Modell zusammengebaut und dann einige zusätzliche Accessoires, wie zum Beispiel Waffen, werden hinzugefügt. Hier haben wir das GUNDAM-Modell und das MrGu-Modell zusammengebaut und sie dann mit ihren jeweiligen Waffen ausgestattet.

Die spezifischen Implementierungsschritte sind wie folgt:

  1. Erstellen Sie eine Modellschnittstelle aus abstrakten Komponenten mit der Assembler-Methode; >Erstellen Sie spezifische Komponentenklassen (GUNDAM-Klasse und MrGu-Klasse) und implementieren Sie die obige Modellschnittstelle

  2. definiert einen Dekorateur, der die Anfrage des Kunden annimmt und entsprechend der Anfrage des Kunden reagiert 🎜>

  3. definiert eine Klasse, die speziell die Dekoration implementiert, die verwendet wird, um dem Objekt entsprechende Funktionen hinzuzufügen.

  4. Codebeispiel:

  5. interface Model{
        void  assemble();
    }
    
    class GUNDAM implements Model{
        @Override
        public void  assemble() {
            System.out.println("组装一个高达模型");
        }
    }
    
    class MrGu implements Model{
        @Override
        public void  assemble() {
            System.out.println("组装一个扎古模型");
        }
    }
    
    abstract class  AddExtra implements Model{
        protected  Model model;
        
        public AddExtra(Model model){
            this.model=model;
        }
        public  void assemble(){
            model.assemble();
        }
    }
    
    class LightSaber extends AddExtra{
    
        public LightSaber(Model model) {
            super(model);
        }
        
        public  void assemble(){
            model.assemble();
            addLightSaber();
        }
        public void addLightSaber(){
            System.out.println("添加光剑");
        }
    }
    
    
    class RocketLauncher extends AddExtra{
    
        public RocketLauncher(Model model) {
            super(model);
        }
        
        public  void assemble(){
            model.assemble();
            addRocketLauncher();
        }
        public void addRocketLauncher(){
            System.out.println("添加火箭筒");
        }
    }
    
    public static void main(String[] args) {
        
            Model gundam=new GUNDAM();
            Model mrgu=new MrGu();
            gundam.assemble();
            mrgu.assemble();
                
            Model gModel=new LightSaber(new GUNDAM());
            gModel.assemble();
            Model mModel=new RocketLauncher(new MrGu());
            mModel.assemble();
    }
Ergebnis ausführen:

    组装一个高达模型
    组装一个扎古模型
    
    组装一个高达模型
    添加光剑
    组装一个扎古模型
    添加火箭筒
Im obigen Code, wenn wir nur das zusammenbauen wollen Mit Gundam oder diesem Zaku-Modell können Sie die Modellklasse direkt instanziieren und die darin enthaltenen Methoden aufrufen. Wenn Sie beim Zusammenbau des Modells eine Waffe hinzufügen müssen, müssen Sie nur die entsprechende Funktion über die Dekoratorklasse hinzufügen. Anhand dieses Beispiels haben wir herausgefunden, dass beim Versuch, den

Decorator-Modus

zu verwenden, einige Klassen erweitert werden können, ohne die vorherigen Funktionen zu beeinträchtigen, was die Flexibilität verbessert.


Vorteile des Dekorationsmusters:

Die Dekorationsklasse und die dekorierte Klasse können unabhängig voneinander entwickelt werden, mit geringer Kopplung, einfacher Erweiterung, Flexibilität und Bequemlichkeit.

Nachteile des Dekoratormusters:

Eine zu starke Dekoration einer Klasse erhöht die Komplexität.

Nutzungsszenarien

Wenn der Prototyp unverändert bleibt und einige Funktionen dynamisch hinzugefügt werden.

Verwandte Empfehlungen:

Einführung in den Adaptermodus und Bridge-Modus in Java-Entwurfsmustern (Codebeispiele)

Builder-Modus und Prototyp-Modus in Java-Entwurfsmustern Einführung ( Codebeispiel)

Das obige ist der detaillierte Inhalt vonEinführung in Appearance Pattern und Decorator Pattern in Java Design Patterns (Codebeispiel). 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