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

noM*_*MAD 9 java decorator

我是设计模式的新手,我被要求使用装饰模式从1到10打印数字.我很抱歉,如果这是微不足道的,但我需要学习.这是我到目前为止:

接口

public interface NextNumber {
    public int getNextNumber(int n);
}
Run Code Online (Sandbox Code Playgroud)

抽象类

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

DecoratorClass

public class DecoratorCount extends PrintNumbers {
    public DecoratorCount(NextNumber next, int num)
    {
        super(next, num);
    }

    public static void main(String[] args)
    {
        int i = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

不确定如何继续,或者即使我走的是正确的方式.有人能解开一些光吗?

das*_*h1e 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,例如,您可以将数字乘以2.

public class DoubleDecoratorCount extends DecoratorCount {

    public DecoratorCount(PrintNumbers pn)
    {
        super(pn);
    }

    public int getNextNumber()
    {    
        return pn.getNextNumber() * 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以用这种方式测试装饰器

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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