科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件使用Decorator模式 翻译者:Disneytiger

使用Decorator模式 翻译者:Disneytiger

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

举例来说,如果你想得到一个带有边框的Swing类型标签,你可以子类化javax.swing.JLabel类。然而,子类化并不总是有效。当继承不能解决问题的时候,你不得不求助与其它的方式。比如,使用Decorator模式。

作者:中国IT实验室 来源:中国IT实验室 2007年8月26日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
  BorderDecorator类
  我们以BorderDecorator开始。这个类表示的装饰者会为Swing组件增加一个边框。示例代码如列表2
  the BorderDecorator class
  package decorator;
  
  import javax.swing.JComponent;
  import java.awt.Graphics;
  import java.awt.Color;
  import java.awt.BorderLayout;
  
  public class BorderDecorator extends JComponent {
  
  // decorated component
  protected JComponent child;
  
  public BorderDecorator(JComponent component) {
  child = component;
  this.setLayout(new BorderLayout());
  this.add(child);
  }
  
  public void paint(Graphics g) {
  super.paint(g);
  int height = this.getHeight();
  int width = this.getWidth();
  g.drawRect(0, 0, width - 1, height - 1);
  }
  }
  注意,这个BorderDecorator扩展了JComponent,它的构造函数接受一个JComponet类型的参数。这个BorderDecorator类有一个类型为JComponent的属性child,它是传进来的Jcomponent对象的一个引用。
  构造函数将被修饰的组件赋值给child变量,并且将这个组件作为一个子组件增加给装饰者。注意,我们使用了BorderLayout作为装饰者的布局。这意味着被增加的这个JComponent将占据这个装饰者的整个区域。
  现在,让我们关注一下paint方法。它首先调用了父类的paint方法。这-步操作将画出装饰者,在第一次得到装饰者的长宽以后,我们在装饰者所在区域的边缘画一个长方形。
  Figure 1 shows a JFrame with three components:
  • An instance of JBorderLabel.
  • A decorated JLabel.
  • A decorated JCheckBox.
  
  Figure 1 -- comparing subclassing and the Decorator pattern
  JBorderLabel的一个实例和一个被装饰过的JLabel对象实例从外表看没有什么不同。这说明,Decorator模式可以作为子类化的一个替代方案。第三个组件证明,你能够使用同一个装饰者去扩展不同对象的实例的行为。从这点来看,装饰者是一个(超类)superior,因为仅仅需要创建一个类(BorderDecorator)就可以扩张不同类型的多个对象的功能。
  显示了图1中的JFrame类的实现代码。
  -- using the BorderDecorator class
  package decorator;
  
  import java.awt.*;
  import javax.swing.*;
  import java.awt.event.*;
  
  public class Frame1 extends JFrame {
  
  JBorderLabel label1 =
  new JBorderLabel("JLabel Subclass");
  
  BorderDecorator label2 =
  new BorderDecorator(new JLabel("Decorated JLabel"));
  
  BorderDecorator checkBox1 =
  new BorderDecorator(new JCheckBox("Decorated JCheckBox"));
  
  public Frame1() {
  try {
  this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  getContentPan
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章