提示:用java包装类以添加新方法
我想问您一些有关此java场景的提示: 我有一个名为提示:用java包装类以添加新方法,java,design-patterns,wrapper,Java,Design Patterns,Wrapper,我想问您一些有关此java场景的提示: 我有一个名为Sequence的简单接口,它执行一些基本操作。现在,我想在一个名为SequenceWrapper的单独类中实现一些额外的方法,该类实现了上面定义的Sequence。下面是一些与我的真实代码类似的示例代码: public interface Sequence { public void methodOne(); public int methodTwo(); } public abstract class Seq
Sequence
的简单接口,它执行一些基本操作。现在,我想在一个名为SequenceWrapper
的单独类中实现一些额外的方法,该类实现了上面定义的Sequence
。下面是一些与我的真实代码类似的示例代码:
public interface Sequence {
public void methodOne();
public int methodTwo();
}
public abstract class SequenceWrapper implements Sequence {
private wrappedSequence = null;
public SequenceWrapper(Sequence sequence){
this.wrappedSequence = sequence;
}
public void methodOne(){
wrappedSequence.methodOne();
}
public int methodTwo(){
return wrappedSequence.methodTwo();
}
}
public class ConcreteWrapper extends SequenceWrapper {
public ConcreteWrapper(Sequence sequence){
super(sequence);
}
// Just an example
public int addMethodOne(){
int a = super.methodTwo();
return a + 3;
}
}
现在,如果我想用另一个方法实现一个类(比如“addMethodTwo()”),我可以简单地扩展“ConcreteWrapper”类并只添加新方法:
public class ConcreteWrapperTwo extends ConcreteWrapper {
public ConcreteWrapperTwo(Sequence sequence){
super(sequence);
}
public int addMethodTwo(){
int a = super.methodTwo();
return a + 30;
}
}
你觉得怎么样?这是正确的代码还是另一种策略更可取
提前感谢- 首先,您的
private wrappedSequence=null代码>没有类型。 我想你的意思是
私有序列wrappedSequence=null代码>
- 其次,在您的示例中,您将永远无法实例化任何类,因为它们都在构造函数中接收另一个
,并且无法创建序列
的第一个实例序列
- 第三,如果您真的需要,组合而不是继承是一个好方法。通常,当需要隐藏或保护对已包装对象的访问时,会包装对象。在本例中,在包装器中,您将公开包装对象的所有方法。然后创建将影响包装器对象的新方法,但不会影响包装器对象
Sequence
的简单接口,它执行一些基本操作。现在我想在一个单独的类中实现一些额外的方法,称为SequenceWrapper
,它实现了上面定义的Sequence
。下面是一些示例代码来解释我的意思:
公共接口序列{
公共无效方法一();
公共int methodTwo();
}
公共抽象类AbstractSequence实现序列{
公共SequenceWrapper(){}
公共方法一(){
//这里的基本行为
}
公共int methodTwo(){
//这里的基本行为
}
}
公共类ConcreteSequence扩展了AbstractSequence{
公共序列(){
超级();
}
//只是一个例子
公共int addMethodOne(){
int a=methodTwo();
返回a+3;
}
}
公共类ConcreteSequenceTwo扩展了AbstractSequence{
第二个(){
超级();
}
公共int addMethodTwo(){
int a=methodTwo();
返回a+30;
}
}
你好,卡洛斯,感谢您的快速响应!我已经实现了一些具体的序列类,但是我没有在示例中报告它们(对不起,我的错误!)。我不想实现继承场景,因为我想将序列的实现与代码的其余部分分开(我有一些压缩序列类,它们比其他序列类“慢”,但它们需要更少的内存)。总之,这并不意味着你需要一个包装器,通过正确的继承,您可以实现同样的效果。在任何范围内,如果你修正了我的第一点,而第二点已经修正了,并且你认为你实际上需要一个包装器,你可以完美地使用它,因为它是一种常见且更容易的方法(比策略或装饰模式更容易)。这里的任何偏好都主要是基于观点的,我认为可以使用策略模式,但我需要我的上下文
类成为策略
类的实例:我的包装顺序
必须是序列
,因为我有一些使用序列
作为输入和输出的读写器。虽然我基本上同意Carlos Robles的回答,但你在那里描述的似乎只是装饰器模式——这是有道理的,但它(像所有模式一样)应该被验证是否真的适合特定的应用案例是的,@Marco13,我同意这一点,如果你看我回答中的评论,我也提到了,但可能更难实现,正如你所说,首先必须检查它是否符合当前的情况。@Carlos Robles是的,我注意到你提到了它,但我想在这里为询问者添加此链接(或其他阅读该问题的人)不知道“装饰者模式”是一种特定的、众所周知的模式,并且该关键字可以用于在web上查找相当多的资源,显示其优缺点和可能的用例。@Marco13是的,这很有用!据我所知,这不是一个“标准”Decorator模式和我的案例不适合Decorator模式案例(我需要向类添加新功能,而不是“扩展”装饰类的功能,如咖啡牛奶场景)