我是设计模式的新手,我被要求使用装饰模式打印1到10的数字。我很抱歉,如果这是微不足道的,但我需要学习。这就是我到目前为止所做的:
接口
public interface NextNumber {
public int getNextNumber(int n);
}
抽象类
abstract public class PrintNumbers implements NextNumber {
protected final NextNumber next;
protected int num;
public PrintNumbers(NextNumber next, int num)
{
this.next = next;
this.num = num;
}
public int getNextNumber(int num)
{
return num+1;
}
}
DecoratorClass
public class DecoratorCount extends PrintNumbers {
public DecoratorCount(NextNumber next, int num)
{
super(next, num);
}
public static void main(String[] args)
{
int i = 0;
}
}
不确定如何继续,或者即使我走的是正确的方式。有人可以解释一下吗?
答案 0 :(得分:6)
首先,decorator类不必扩展装饰的类,而是实现相同的接口。
看看这个维基百科page。
所以你可以像这样纠正装饰者:
// The interface
public interface NextNumber {
public int getNextNumber();
}
// The class to decorate
public class PrintNumbers implements NextNumber {
protected int num;
public PrintNumbers(int startFrom)
{
this.num = startFrom;
}
public int getNextNumber()
{
return num++;
}
}
// The abstract decorator
public abstract class DecoratorCount implements NextNumber {
private PrintNumbers pn;
public DecoratorCount(PrintNumbers pn)
{
this.pn = pn;
}
}
然后例如,您可以将数字乘以2。
public class DoubleDecoratorCount extends DecoratorCount {
public DecoratorCount(PrintNumbers pn)
{
super(pn);
}
public int getNextNumber()
{
return pn.getNextNumber() * 2;
}
}
你可以用这种方式测试装饰器
public class Test {
public static void main (String[] args) {
PrintNumbers pn = new PrintNumbers(0);
DoubleDecoratorCount decorator = new DoubleDecoratorCount(pn);
for (int i = 0 ; i < 5 ; ++i)
System.out.println("value: " + decorator.getNextNumber());
}
}
此时您可以编写所需的所有装饰器:
答案 1 :(得分:3)
首先,你需要一些可能需要装饰的东西,然后你需要一个装饰器来为一些东西。两个类,基类和装饰器都是具体的类,可以直接使用。
从1到10装饰一个计数器没有多大意义(数字总是很漂亮;))。但是你可以实现一个打印未格式化数字的基本类,然后实现一个装饰器,为打印结果增添一些美感。