Java 非常简单地使用decorator模式生成数字

Java 非常简单地使用decorator模式生成数字,java,decorator,Java,Decorator,我是设计图案的新手,我被要求使用装饰图案打印从1到10的数字。我很抱歉,如果这是琐碎的,但我需要学习。这就是我到目前为止所做的: 接口 public interface NextNumber { public int getNextNumber(int n); } 抽象类 abstract public class PrintNumbers implements NextNumber { protected final NextNumber next; protecte

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

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;
    }
}

我不知道该怎么做,甚至不知道我是否走对了路。有人能给你点启发吗?

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


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

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

看看这个维基百科

所以你可以像这样纠正你的装饰师:

// 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;
    }
}
您可以用这种方式测试decorator

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());
    }
}
公共类测试{
公共静态void main(字符串[]args){
打印号码pn=新打印号码(0);
DoubleDecoratorCount decorator=新的DoubleDecoratorCount(pn);
对于(int i=0;i<5;++i)
System.out.println(“值:“+decorator.getNextNumber());
}
}
此时,您可以编写所需的所有装饰器:

  • 乘以3
  • 把结果写在信中
  • 用十六进制写结果
  • 等等

也许看看这里?有一个很好的代码示例。你想如何装饰你的
PrintNumbers
类?@gasan:是的,我看到了这个咖啡示例,并提出了我的代码版本。问题是,我不确定它应该如何工作。我知道它是用来动态更新对象的,但需要一个更清晰的画面。@dash1e:我不确定该给出什么答案。我在答案中给你写了一个例子,我将类修饰为将结果乘以2。谢谢。我看到你有抽象装饰师和类分别装饰。现在在
DoubleDecorateeCount
中,我是否调用
main()
?最好将
main()
放在一个单独的类中。我刚刚用一个样本更新了答案。这让我更好地理解了为什么我们使用这种模式。非常感谢:)