提示:用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

我想问您一些有关此java场景的提示: 我有一个名为
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

  • 其次,在您的示例中,您将永远无法实例化任何类,因为它们都在构造函数中接收另一个
    序列
    ,并且无法创建
    序列
    的第一个实例

  • 第三,如果您真的需要,组合而不是继承是一个好方法。通常,当需要隐藏或保护对已包装对象的访问时,会包装对象。在本例中,在包装器中,您将公开包装对象的所有方法。然后创建将影响包装器对象的新方法,但不会影响包装器对象

您可能需要的只是一个普通的继承场景:

我想向您介绍这个Java场景的细分: 我有一个名为
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模式案例(我需要向类添加新功能,而不是“扩展”装饰类的功能,如咖啡牛奶场景)