簡體   English   中英

裝飾器設計模式,用於向現有對象添加新方法和代碼

[英]decorator design pattern for adding new methods and codes to the existing object

我是設計模式的新手。 我正在嘗試使用裝飾器設計模式向現有應用添加新代碼和功能。

假設我有一類App,其中有兩個方法“ Add”和“ Multiply”。 在某個時間點(運行時),應用程序還將需要計算平均值。 因此,我正在嘗試使用裝飾器設計模式來實現這一點。

到目前為止,我有:

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;
  }

} 

為了做到這一點,我定義了一個接口“ Code”,如下所示:

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

然后是裝飾器抽象類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);
  }

}

現在,我從抽象類定義了一個音樂會類“ AVG”,如下所示:

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); 
  }          
}

現在,我希望我的應用可以計算出平均值,因此我的主要需求是:

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

在這里我可以有:

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

我仍然不能:

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

我不知道哪里出了問題,甚至我都可以針對這種情況使用這種設計模式!

該應用程序的類型為Code,因為AVGcalculator不是Code界面的一部分,如果要調用AVGcalculator,則無法調用它,您可以像這樣進行操作

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

裝飾器模式是一個非常糟糕的選擇。

裝飾者履行與裝飾對象相同的合同—相同的API。 您要更改合同。 因此,該模式不適用(使用裝飾器時,請閱讀示例以作為一個很好的例子)。

您可以使用命令模式進行操作:

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;
    }
}

然后,您可以從那里做很多事情:

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

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

您也可以這樣寫:

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;
}

命令模式是一種行為模式,看起來更像您想要的(改變行為)。

請注意,在C#中,您可以使用擴展方法精確地完成您想要的事情。 但是Java沒有這些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM