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

时间:2012-04-13 06:51:34

标签: java decorator

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

不确定如何继续,或者即使我走的是正确的方式。有人可以解释一下吗?

2 个答案:

答案 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());
    }
}

此时您可以编写所需的所有装饰器:

  • 乘以3;
  • 以书信形式写出结果;
  • 以十六进制写入结果;
  • 等等...

答案 1 :(得分:3)

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

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