装饰器模式在Java中是如何工作的?

装饰器模式在Java中是如何工作的?,java,decorator,Java,Decorator,我在试着理解装饰图案。下面是我试图理解它是如何工作的代码 public static void main(String[] args) { Room myRoom = new CurtainDecorator(new ColorDecorator(new SimpleRoom())); System.out.println(myRoom.showRoom()); } 下面是我的具体课程 public class SimpleRoom impl

我在试着理解装饰图案。下面是我试图理解它是如何工作的代码

public static void main(String[] args)
    {
        Room myRoom =  new CurtainDecorator(new ColorDecorator(new SimpleRoom()));
        System.out.println(myRoom.showRoom());

    }
下面是我的具体课程

public class SimpleRoom implements Room{

    @Override
    public String showRoom()
    {
        return "show room";
    }
}
下面是我的抽象装饰类

public abstract class RoomDecorator implements Room{

    public Room roomReference;

    @Override
    public String showRoom()
    {
        return roomReference.showRoom();
    }
}
下面是我的装饰器实现1

public class ColorDecorator extends RoomDecorator{

    @Override
    public String showRoom()
    {
        return  addColors(); //How does showRoom() method gets invoked here?
    }

    public ColorDecorator(Room room)
    {
        this.roomReference = room;
    }

    public String addColors()
    {
        return  "Blue";
    }
}
下面是我的Decorator实现2

public class CurtainDecorator extends RoomDecorator{


    public CurtainDecorator(Room room)
    {
        this.roomReference = room;
    }

    @Override
    public String showRoom()
    {
        return this.roomReference.showRoom() + addCurtains();  //What will showRoom method invoke?
    }


public String addCurtains()
{
    return "Curtain";
}
}

输出为蓝色窗帘

我的问题放在评论中。

最后你有: CurtainDecorator(ref=ColorDecorator(ref=SimpleeRoom)))


当您从main调用showRoom时,它会调用CurtainDecorator的方法,该方法首先转到输出“蓝色”的引用(本例中为ColorDecorator),然后CurtainDecorator将其添加为位“窗帘”。

看一看。这肯定会有帮助:-)这是坏模式的可能副本不要使用它,而是考虑如何重构它,以便在需要添加新特性时不扩展子类。