非常简单地使用装饰器模式生成数字

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() 放在一个单独的类中。我刚刚用示例更新了答案。

以上是关于非常简单地使用装饰器模式生成数字的主要内容,如果未能解决你的问题,请参考以下文章

装饰器模式

为 ServiceCollection 实现装饰器模式

设计模式——装饰器模式

如何使用装饰器模式极大地增强fetch()

设计模式之装饰器模式

设计模式之-装饰器模式