2016-05-04 3 views
-1

Ich bin neu in Design-Mustern. Ich versuche, Dekorationsmuster zu verwenden, um meiner bestehenden App neue Codes und Funktionen hinzuzufügen.Decorator Entwurfsmuster zum Hinzufügen neuer Methoden und Codes zum vorhandenen Objekt

Angenommen, ich habe eine Klasse von App, die zwei Methoden "Add" und "Multiply" hat. Zu einem bestimmten Zeitpunkt (Laufzeit) muss die App auch den Durchschnitt berechnen. Also versuche ich Decorator Design-Muster zu verwenden, um dies zu ermöglichen.

Bisher habe ich:

public class App implements Code{ 
    public int a=2; 
    public int b=3; 

    @Override 
    public int Add(int a, int b) { 
    int add; 
    add = a+b; 
    return add; 
    } 

    @Override 
    public int Multiply(int a, int b) { 
    int mul; 
    mul= a*b; 
    return mul; 
    } 

} 

Um dies zu tun, ich eine Schnittstelle "Code" wie folgt definieren:

public interface Code { 
    public int Add (int a, int b); 
    public int Multiply (int a, int b);  
} 

und dann ein Dekorateur abstrakte Klasse CodeExtention

public abstract class CodeExtention implements Code{ 
    protected Code extendedCode; 

    public CodeExtention(Code extendedCode) { 
    this.extendedCode = extendedCode; 
    } 

    @Override 
    public int Multiply(int a, int b){ 
    return extendedCode.Multiply(a, b); 
    } 

    @Override 
    public int Add(int a, int b){ 
    return extendedCode.Add(a, b); 
    } 

} 

Jetzt definiere ich eine Konzertklasse "AVG" erweitert von meiner abstrakten Klasse wie folgt:

public class AVG extends CodeExtention{ 

    public AVG(Code extendedCode) { 
    super(extendedCode); 
    } 

    public int AVGcalculator (int a, int b){ 
    return (a+b)/2;  
    } 

    @Override 
    public int Add(int a, int b) { 
    return super.Add(a, b); 
    } 

    @Override 
    public int Multiply(int a, int b) { 
    return super.Multiply(a, b); 
    }   
} 

Jetzt erwarte ich, dass mein app die durchschnittlichen berechnen kann dies zu tun in Ich habe mein Haupt:

public static void main(String[] args) { 
    Code app = new App(); 
    app = new AVG(app); 
    } 
} 

Hier kann ich:

System.out.println(app.Add(3, 4)); 
System.out.println(app.Multiply(3, 4)); 

Ich kann immer noch nicht haben:

System.out.println(app.AVGcalculator(3, 4)); 

Ich weiß nicht, was falsch ist, oder auch wenn ich kann dieses Entwurfsmuster für mein Szenario verwenden!

Antwort

1

Die App ist vom Typ-Code seit AVGcalculator nicht Teil-Code-Schnittstelle ist, können Sie es nicht nennen, wenn Sie für AVGcalculator nennen wollen Sie es wie dieses

tun können
System.out.println(((AVG)app).AVGcalculator(3, 4)); 
+0

Danke Ich würde gerne wissen, ob es der richtige Weg ist, neue Methoden zu meinen Objekten zur Laufzeit hinzuzufügen? – Farhood

+0

Könnten Sie bitte erklären, was ist "((AVG) App)"? – Farhood

+0

Es heißt Casting bedeutet im Grunde, einen Typ zu einem anderen zu drehen. Aber natürlich ist es nicht immer möglich, beispielsweise Integer nicht in Date zu übertragen. Ich schlage vor, Sie lesen über Casting hier ist ein schöner Link https://howtoprogramwithjava.com/java-cast/ – urag

1

Das Decorator-Muster ist eine wirklich schlechte Wahl dafür.

Der Dekorateur erfüllt den gleichen Vertrag — die gleiche API — als das dekorierte Objekt. Was Sie wollen, ist den Vertrag zu ändern. Daher ist das Muster nicht anwendbar (lesen Sie this als ein gutes Beispiel für die Verwendung eines Dekorators).

Was können Sie tun, wird mit dem Befehl Muster:

interface BinaryIntOperation { 
    int execute(int a, int b); 
} 

class AddOperation implements BinaryIntOperation { 
    int execute(int a, int b) { 
     return a + b; 
    } 
} 

class MultiplyOperation implements BinaryIntOperation { 
    int execute(int a, int b) { 
     return a * b; 
    } 
} 

class AverageOperation implements BinaryIntOperation { 
    int execute(int a, int b) { 
     return (a + b)/2; 
    } 
} 

Sie können dann viele tun es aus:

BinaryIntOperation op = new AddOperation(); 
System.out.println(op.execute(3, 4)); 

op = new MultiplyOperation(); 
System.out.println(op.execute(4, 5)); 

Sie können auch Dinge wie das schreiben:

public int[] execute(int[] arr, BinaryIntOperation op, int a) { 
    for (int i = 0; i < arr.length; i++) 
     arr[i] = op.execute(a, arr[i]); 
    return arr; 
} 

Der Befehl Muster ist ein Verhaltensmuster, das mehr wie das, was Sie wollen, aussieht (Verhaltensänderung).

Beachten Sie, dass in C#, Sie genau tun könnte, was Sie mithilfe Erweiterungsmethoden wollen. Aber Java hat diese nicht.

+0

Eigentlich möchte ich ein Verhalten nicht ändern. Ich möchte ein neues Verhalten hinzufügen. Zum Beispiel kann meine App Add und Multiply jetzt, aber ich will es in der Lage sein, Durchschnitt zusätzlich zu seinen vorherigen Fähigkeiten zu berechnen. Ich will zeigen, dass es fähig ist, sich zu entwickeln! Der Grund, warum ich am Anfang nicht alle Möglichkeiten nutzen möchte, ist, den Aufwand für zusätzliche Codes zu reduzieren. Eigentlich baue ich ein intelligentes Objekt, das wachsen kann (entwickelt werden kann), indem es sich selbst neue Funktionalitäten hinzufügt. Mein Ziel ist es, meinem Objekt eine modulare Struktur zu geben. Zum Beispiel, wenn es ein Sicherheitsmodul benötigt. – Farhood

+0

Wenn ein Sicherheitsmodul benötigt wird, kann der Code für die Sicherheit hinzugefügt werden oder, wenn ein Kommunikationsmodul benötigt wird, muss ein Code für die Kommunikation zu den Basiscodes hinzugefügt werden ... siehe dieses Bild http://cdn.crowdfundinsider.com/wp -content/uploads/2015/10/Blocks-Modular-Smart-Watch.jpg Dies ist eine modulare Uhr .. Es hat eine Kernkomponente und Sie können verschiedene Module hinzufügen/entfernen und Ihre Uhr nach Ihren Bedürfnissen anpassen. Wenn Sie eine Hart-Überwachung benötigen, können Sie ein Modul hinzufügen, wenn Sie GPS benötigen, können Sie GPS-Modul usw. hinzufügen. Ich muss eine ähnliche Struktur für mein Objekt erstellen .. verschiedene Code-Module hinzufügen/entfernen .. – Farhood

+0

Sie können * nicht * Verhalten mit einem Decorator hinzufügen. Sie können * vorhandenes Verhalten * mit einem Decorator ändern. Sie verwenden das falsche Muster. Verwenden Sie eine einfache Komposition, um solche modularen Objekte zu erstellen. – Polygnome

Verwandte Themen