天天看点

结构型模式之装饰模式(界面显示构件库)

题目:某软件公司基于面向对象技术开发了一套图形界面显示构件库VisualComponent。在使用该库构建某图形界面时,用户要求为界面定制一些特效显示效果,如带滚动条的窗体或透明窗体等。现使用装饰模式设计该构件库,绘制类图并编程模拟实现。

类图

结构型模式之装饰模式(界面显示构件库)

Client

package 装饰模式;

//抽象界面构件类:抽象构件类,为了突出与模式相关的核心代码,对原有控件代码进行了大量的简化
abstract class Component
{
       public  abstract void display();
}
 
//窗体类:具体构件类
class Window extends Component
{
       public  void display()
       {
              System.out.println("显示窗体!");
       }
}
 
//文本框类:具体构件类
class TextBox extends Component
{
       public  void display()
       {
              System.out.println("显示文本框!");
       }
}
 
//列表框类:具体构件类
class ListBox extends Component
{
       public  void display()
       {
              System.out.println("显示列表框!");
       }
}
 
//构件装饰类:抽象装饰类
class ComponentDecorator extends Component
{
       private Component component;  //维持对抽象构件类型对象的引用
 
       public ComponentDecorator(Component  component)  //注入抽象构件类型的对象
       {
              this.component = component;
       }
 
       public void display()
       {
              component.display();
       }
}
 
//滚动条装饰类:具体装饰类
class ScrollBarDecorator extends  ComponentDecorator
{
       public ScrollBarDecorator(Component  component)
       {
              super(component);
       }
 
       public void display()
       {
              this.setScrollBar();
              super.display();
       }
 
       public  void setScrollBar()
       {
              System.out.println("为构件增加滚动条!");
       }
}
 
//黑色边框装饰类:具体装饰类
class BlackBorderDecorator extends  ComponentDecorator
{
       public BlackBorderDecorator(Component  component)
       {
              super(component);
       }
 
       public void display()
       {
              this.setBlackBorder();
              super.display();
       }
 
       public  void setBlackBorder()
       {
              System.out.println("为构件增加黑色边框!");
       }
}

class Client
{
       public  static void main(String args[])
       {
              Component  component,componentSB,componentBB; //全部使用抽象构件定义
              component = new Window();
              componentSB = new  ScrollBarDecorator(component);
              componentSB.display();
              System.out.println("----------------");
              componentBB = new  BlackBorderDecorator(componentSB); //将装饰了一次之后的对象继续注入到另一个装饰类中,进行第二次装饰
              componentBB.display();
       }
}
           

运行效果图

结构型模式之装饰模式(界面显示构件库)

继续阅读