博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java添加新代码_关于java:decorator设计模式,用于向现有对象添加新方法和代码...
阅读量:5733 次
发布时间:2019-06-18

本文共 3375 字,大约阅读时间需要 11 分钟。

我是设计模式的新手。 我正在尝试使用装饰器设计模式向现有应用添加新代码和功能。

假设我有一类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));

我不知道哪里出了问题,甚至我都可以针对这种情况使用这种设计模式!

装饰器模式是一个非常糟糕的选择。

装饰器以与装饰对象相同的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没有这些。

其实我不想改变行为。我想添加新的行为。例如,我的应用程序现在可以添加和相乘,但我希望它除了以前的功能外还能够计算平均值,我想证明它可以发展!我之初不想提供所有功能的原因是为了减少拥有额外代码的开销。实际上,我正在构建一个智能对象,该对象可以通过向自身添加新功能来增长(得到发展)。我的目标是为我的对象构建一个模块化结构。例如,如果需要安全模块。

如果它需要安全模块,则可以添加安全代码,或者如果它需要通信模块,则需要在其基本代码中添加与通信相关的代码...参见此图像cdn.crowdfundinsider.com/wp-content/uploads/ 2015/10 /这是一款模块化手表..它具有核心组件,您可以添加/删除不同的模块,并根据需要自定义手表。如果需要哈特监控,则可以添加模块,如果需要GPS,则可以添加GPS模块等。我需要为我的对象创建类似的结构,以便添加/删除不同的代码模块。

您不能使用装饰器添加行为。您可以使用装饰器修改现有行为。您使用了错误的模式。使用简单的组合来创建此类模块化对象。

您能详细说明一下吗?

到底是什么?

如何使用简单的组合来创建这样的模块化对象...您能否通过编辑代码来举例说明我的情况?谢谢

我已经给您提供了一个代码示例。您可以从那里轻松创建一个对象,该对象包含BinaryIntOperations的列表或映射,并且可以容易地与更多对象进行扩展。但是对于设计模式的深入解释,这是错误的格式,这是一个问答网站。我能说的唯一真正有用的事情是您使用了错误的模式。但是对于您可以做的其他事情,没有一个单一的规范答案。可能的解决方案范围太广了,在此不予赘述。

该应用程序的类型为Code,因为AVGcalculator不是Code界面的一部分,如果要调用AVGcalculator,则无法调用它,您可以像这样进行操作

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

谢谢我想知道是否是在运行时向对象添加新方法的正确方法?

您能否解释一下"((AVG)app)"是什么?

它被称为强制转换,基本上意味着将一种类型转换为另一种类型。但是当然并非总是可能的,例如您不能将Integer转换为Date。我建议您阅读有关转换的信息,这是一个不错的链接howtoprogramwithjava.com/java-cast

谢谢,这是在运行时向对象添加新方法的正确方法吗?你有什么建议吗?

不它不是。 Decorator不会在运行时添加新方法,而是会在运行时添加新行为。

转载地址:http://lxowx.baihongyu.com/

你可能感兴趣的文章
XT [2011-06-25]更新到0.41版本
查看>>
鼠标停留在GridView某一行时行的颜色改变
查看>>
【v2.x OGE教程 14】控件使用
查看>>
系列3:WAS Liberty Profile hello mysql jdbc
查看>>
基础知识:python模块的导入
查看>>
Android MVC之我的实现
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
关于批处理-1
查看>>
Tomcat部署Web应用方法总结
查看>>
Python3 django2.0 字段加密 解密 AES
查看>>
CCNA实验之:网络地址转换(NAT)实验
查看>>
计算机网络原理笔记-停止等待协议
查看>>
NET牛人应该知道些什么?
查看>>
[Asp.Net web api]基于自定义Filter的安全认证
查看>>
洛谷P3763 [TJOI2017]DNA(后缀自动机)
查看>>
确定当前记录和下一条记录之间相差的天数
查看>>
NYOJ32:组合数(DFS入门)
查看>>
使用Callable和Future接口创建线程
查看>>
BZOJ 2568 比特集合
查看>>