[英]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.