// The Window interface class
publicinterfaceWindow{publicvoiddraw();// Draws the Window
publicStringgetDescription();// Returns a description of the Window
}
具体构件角色
1
2
3
4
5
6
7
8
9
10
// implementation of a simple Window without any scrollbars
publicclassSimpleWindowimplementsWindow{publicvoiddraw(){// Draw window
}publicStringgetDescription(){return"simple window";}}
抽象装饰者角色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// abstract decorator class - note that it implements Window
publicabstractclassWindowDecoratorimplementsWindow{protectedWindowdecoratedWindow;// the Window being decorated
publicWindowDecorator(WindowdecoratedWindow){this.decoratedWindow=decoratedWindow;}@Overridepublicvoiddraw(){decoratedWindow.draw();}@OverridepublicStringgetDescription(){returndecoratedWindow.getDescription();}}
// The first concrete decorator which adds vertical scrollbar functionality
publicclassVerticalScrollBarextendsWindowDecorator{publicVerticalScrollBar(WindowwindowToBeDecorated){super(windowToBeDecorated);}@Overridepublicvoiddraw(){super.draw();drawVerticalScrollBar();}privatevoiddrawVerticalScrollBar(){// Draw the vertical scrollbar
}@OverridepublicStringgetDescription(){returnsuper.getDescription()+", including vertical scrollbars";}}// The second concrete decorator which adds horizontal scrollbar functionality
publicclassHorizontalScrollBarextendsWindowDecorator{publicHorizontalScrollBar(WindowwindowToBeDecorated){super(windowToBeDecorated);}@Overridepublicvoiddraw(){super.draw();drawHorizontalScrollBar();}privatevoiddrawHorizontalScrollBar(){// Draw the horizontal scrollbar
}@OverridepublicStringgetDescription(){returnsuper.getDescription()+", including horizontal scrollbars";}}
classWindowDecoratorTest{// for print descriptions of the window subclasses
voidprintInfo(Windoww){System.out.println("description:"+w.getDescription());}@Testvoidmain(){// original SimpleWindow
SimpleWindowsw=newSimpleWindow();printInfo(sw);// HorizontalScrollBar mixed Window
HorizontalScrollBarhbw=newHorizontalScrollBar(sw);printInfo(hbw);// VerticalScrollBar mixed Window
VerticalScrollBarvbw=newVerticalScrollBar(hbw);printInfo(vbw);}}