9

我是设计模式的新手,我被要求使用装饰器模式打印 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;
    }
}

不知道如何继续,或者即使我走对了路。有人可以解释一下吗?

4

2 回答 2

6

首先,装饰器类不必扩展装饰但实现相同接口的类。

看看这个维基百科页面

所以你可以像这样更正你的装饰器:

// 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;
  • 将结果写在信中;
  • 以十六进制写入结果;
  • ETC...
于 2012-04-13T07:13:31.810 回答
3

首先,你需要一些可能需要一些装饰的东西,然后你需要一个装饰器来装饰那个东西。基类和装饰器这两个类都是具体类,可以直接使用。

将计数器从 1 装饰到 10 没有多大意义(数字总是很漂亮;))。但是您可以实现一个打印未格式化数字的基本类,然后实现一个装饰器,为打印结果添加一些美感。

于 2012-04-13T07:10:59.797 回答