举例来说,如果你想得到一个带有边框的Swing类型标签,你可以子类化javax.swing.JLabel类。然而,子类化并不总是有效。当继承不能解决问题的时候,你不得不求助与其它的方式。比如,使用Decorator模式。
¡¡¡¡
ʹÓÃDecoratorģʽ¡¡¡¡Java³ÌÐòÔ±ÖªµÀ¿ÉÒÔͨ¹ýÀ©Õ¹Ò»¸öÀàÀ´¸Ä±äÀàµÄÐÐΪºÍÀ©Õ¹Ò»¸öÀàµÄ¹¦ÄÜ¡£Õâ¸öÐÐΪ±»³ÆΪ¼Ì³Ð,ËüÊÇÃæÏò¶ÔÏó±à³ÌµÄÒ»¸öÖØÒªµÄÌØÐÔ.
¡¡¡¡¾ÙÀýÀ´Ëµ,Èç¹ûÄãÏëµÃµ½Ò»¸ö´øÓб߿òµÄSwingÀàÐͱêÇ©£¬Äã¿ÉÒÔ×ÓÀ໯javax.swing.JLabelÀࡣȻ¶ø£¬×ÓÀ໯²¢²»×ÜÊÇÓÐЧ¡£µ±¼Ì³Ð²»Äܽâ¾öÎÊÌâµÄʱºò£¬Äã²»µÃ²»ÇóÖúÓëÆäËüµÄ·½Ê½¡£±ÈÈ磬ʹÓÃDecoratorģʽ¡£
¡¡¡¡ÕâƪÎÄÕ½âÊÍÁËDecoratorģʽÊÇʲô£¬²¢ËµÃ÷ʲôʱºòÓ¦¸Ã×ÓÀ໯£¬Ê²Ã´Ê±ºòÓ¦¸Ã²ÉÓÃDecorateģʽ¡£
¡¡¡¡ÔÚJavaÓïÑÔÖйؼü×Öextends±»ÌṩÀ´×ÓÀ໯£¨À©Õ¹£©Ò»¸öÀà¡£¾ßÓзḻµÄÃæÏò¶ÔÏó±à³Ì¾ÑéµÄ³ÌÐòÔ±ÖªµÀ×ÓÀ໯µÄÍþÁ¦¡£Í¨¹ýÀ©Õ¹Ò»¸öÀ࣬ÎÒÃÇÄܹ»¸Ä±äÕâ¸öÀàµÄÐÐΪ¡£ÒÔÁбí1Ëù½²µÄJBorderLabelÀàΪÀý£¬ËüÀ©Õ¹ÁËjavax.swing.JLabelÀ࣬³ýÁ˶àÁËÒ»¸ö±ß¿ò£¬ËüºÍJLabelÀà¾ßÓÐÏàͬµÄÍâ¹ÛºÍÐÐΪ¡£
¡¡¡¡the JBorderLabel class, an example of subclassing
¡¡¡¡package decorator;
¡¡¡¡
¡¡¡¡import java.awt.Graphics;
¡¡¡¡import javax.swing.JLabel;
¡¡¡¡import javax.swing.Icon;
¡¡¡¡
¡¡¡¡public class JBorderLabel extends JLabel {
¡¡¡¡
¡¡¡¡public JBorderLabel() {
¡¡¡¡super();
¡¡¡¡}
¡¡¡¡
¡¡¡¡public JBorderLabel(String text) {
¡¡¡¡super(text);
¡¡¡¡}
¡¡¡¡
¡¡¡¡public JBorderLabel(Icon image) {
¡¡¡¡super(image);
¡¡¡¡}
¡¡¡¡
¡¡¡¡public JBorderLabel(String text, Icon image, int horizontalAlignment) {
¡¡¡¡super(text, image, horizontalAlignment);
¡¡¡¡}
¡¡¡¡
¡¡¡¡public JBorderLabel(String text, int horizontalAlignment) {
¡¡¡¡super(text, horizontalAlignment);
¡¡¡¡}
¡¡¡¡
¡¡¡¡protected void paintComponent(Graphics g) {
¡¡¡¡super.paintComponent(g);
¡¡¡¡int height = this.getHeight();
¡¡¡¡int width = this.getWidth();
¡¡¡¡g.drawRect(0, 0, width - 1, height - 1);
¡¡¡¡}
¡¡¡¡}
²é¿´±¾ÎÄÀ´Ô´