在这种情况下如何使用Decorator Design?

时间:2017-03-08 23:00:48

标签: java algorithm design-patterns

以下是我的测试代码。案例是:我尝试创建一个允许附加许多装饰器的视图,如滚动条,额外子视图,backgroundColor,对此视图的特殊效果等。问题是我发现i1和{{ 1}}不是我真正需要的,我需要的是i2whatINeed1。在这种情况下,有whatINeed2i1的重点是什么。在这种情况下,它们不会变成发电机吗?

语法可能在许多地方都是错误的,因为我在objective-c中进行了测试,但是在线复制并定制了java示例代码。

如果我从一开始就错了,你能指出来吗!

i2

谈论装饰器设计是在不修改现有代码的情况下添加额外功能。我如何实现下面显示的模型?如何在不修改源代码的情况下绘制边框和滚动条?滚动条需要与原始窗口进行交互。 enter image description here

1 个答案:

答案 0 :(得分:1)

装饰器通常用于添加额外的"功能"到X类(方法让我们说)没有修改X的源代码。

public class PlayerScore{ 
    void setScore(int); 
}

我们想添加一种方法,让我们可以在梯子中获得分数排名,但我们不能/不想修改PlayerScore ..然后:

public class MyPlayerScore extends PlayerScore{
    PlayerScore component;

    int getRank() { /**some code**/}
    void setScore(int x){ component.setScore(x);}

}

根据代码的外观,您实际上并没有添加功能。基类我已经具有功能setBackgroundColor(),addSubView()等,你只是在子类中调用它们。

这看起来像是继承和组合模式的混合,而不是Decorator,即使组合部分(通过将Component传递给构造函数)使它看起来像装饰器。

如果代码适用于您,但是如果您想使用Decorator模式,那么您将为继承类添加越来越多的方法,因为您需要为这些类获取越来越多的特殊行为(类PanelView会例如,添加void scroll())

有关装饰者的更多信息:https://en.wikipedia.org/wiki/Decorator_pattern

修改(1):

要使用装饰器将滚动条添加到父视图,一个窗口可以说,父类必须暴露某种形式的接口,新的装饰类可以使用它来实现滚动行为。例如,如果窗口有一个返回某个Graphics API句柄的方法,那么让我们调用句柄'然后装饰器类ScrollPane可以执行以下操作:

public class ScrollPane extends Window{
    Window component;
    void renderScrollBar(){
        Graphics g = window.getGraphicsHandle();
        g.drawRectangle(/** some coords for where to put the bar **/);
        /** some extra code to add logic on the scroll bar,
        /** such as shifting the Window content up or down and cull out
        /** the portion that is outside of the ScrollPane.
        /** For example, openGL could allow you to do this with scissor 
        /** test **/
    }

    void render(){
        component.render();
        this.renderScrollPane();
    }
}

https://www.khronos.org/opengl/wiki/Scissor_Test如果您对评论的最后部分感兴趣。

这就是你如何去做的。显然,实现一个运行良好的滚动窗格可能需要更多思考,但在布置类架构方面,Decorator模式可以很好地为您设计GUI。