非常简单地使用装饰器模式生成数字
Posted
技术标签:
【中文标题】非常简单地使用装饰器模式生成数字【英文标题】:Very Simple Use of decorator pattern to generate numbers 【发布时间】:2012-04-25 13:24:37 【问题描述】:我是设计模式的新手,我被要求使用装饰器模式打印从 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;
装饰类
public class DecoratorCount extends PrintNumbers
public DecoratorCount(NextNumber next, int num)
super(next, num);
public static void main(String[] args)
int i = 0;
不确定如何继续,或者即使我走对了路。有人能解释一下吗?
【问题讨论】:
也许看这里en.wikipedia.org/wiki/Decorator_pattern ?有一个很好的代码示例。 你想如何装饰你的PrintNumbers
班级?
@gasan:是的,我看到了那个咖啡示例并提出了我的代码版本。问题是,我不确定它应该如何工作。我知道它用于动态更新对象但需要更清晰的图片。
@dash1e:我不知道该怎么回答。
我在答案中给你写了一个例子,我装饰类以将结果乘以 2。
【参考方案1】:
首先,你需要一些可能需要一些装饰的东西,然后你需要一个装饰器来装饰那个一些东西。基类和装饰器类都是具体类,可以直接使用。
从 1 到 10 装饰一个计数器没有多大意义(数字总是很漂亮;))。但是您可以实现一个打印未格式化数字的基本类,然后实现一个装饰器,为打印结果增添一些美感。
【讨论】:
这让我更好地理解了我们为什么使用这种模式。非常感谢:)【参考方案2】:首先装饰器类不必扩展装饰类但实现相同的接口。
看看这个***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());
此时你可以编写你需要的所有装饰器:
乘以 3; 将结果写成信; 以十六进制写入结果; 等等……【讨论】:
谢谢。我看到您有抽象装饰器和要分别装饰的类。现在我在DoubleDecorateeCount
中调用main()
吗?
最好将main()
放在一个单独的类中。我刚刚用示例更新了答案。以上是关于非常简单地使用装饰器模式生成数字的主要内容,如果未能解决你的问题,请参考以下文章