searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

设计模式之装饰模式

2023-10-07 06:58:35
10
0

1、前言

装饰器模式可用于静态或动态地将附加职责附加到对象。装饰器为原始对象提供了增强的接口。
在这种模式的实现中,我们更喜欢组合而不是继承——这样我们就可以减少为每个装饰元素一次又一次子类化的开销。此设计涉及的递归可用于根据需要多次装饰我们的对象。

2、装饰模式示例

假设我们有一个圣诞树对象并且我们想要装饰它。装饰并不改变物体本身;只是除了圣诞树之外,我们还添加了一些装饰物品,如花环、金属丝、树顶、泡泡灯等:
 

对于此场景,我们将遵循原始的“四人帮”设计和命名约定。首先,我们将创建一个 ChristmasTree 接口及其实现:
public interface ChristmasTree {
    String decorate();
}
该接口的实现如下所示:
public class ChristmasTreeImpl implements ChristmasTree {

    @Override
    public String decorate() {
        return "Christmas tree";
    }
}
 
我们现在将为这棵树创建一个抽象类 TreeDecorator 。该装饰器将实现 ChristmasTree 接口并保存ChristmasTree的对象。同一接口中实现的方法将简单地调用我们接口中的decorate()方法:
public abstract class TreeDecorator implements ChristmasTree {
    private ChristmasTree tree;
    
    // standard constructors
    @Override
    public String decorate() {
        return tree.decorate();
    }
}
我们现在将创建一些装饰元素。这些装饰器将扩展我们的抽象类 TreeDecorator ,并根据我们的要求修改其 Decorate() 方法:
public class BubbleLights extends TreeDecorator {

    public BubbleLights(ChristmasTree tree) {
        super(tree);
    }
    
    public String decorate() {
        return super.decorate() + decorateWithBubbleLights();
    }
    
    private String decorateWithBubbleLights() {
        return " with Bubble Lights";
    }
}
 
对于本例,以下情况为true:
@Test
public void whenDecoratorsInjectedAtRuntime_thenConfigSuccess() {
    ChristmasTree tree1 = new Garland(new ChristmasTreeImpl());
    assertEquals(tree1.decorate(), 
      "Christmas tree with Garland");
     
    ChristmasTree tree2 = new BubbleLights(
      new Garland(new Garland(new ChristmasTreeImpl())));
    assertEquals(tree2.decorate(), 
      "Christmas tree with Garland with Garland with Bubble Lights");
}

请注意,在第一个 tree1 对象中,我们仅用一个Garland装饰它,而另一个 tree2 对象我们用一个 BubbleLights 和两个Garland装饰。这种模式使我们能够灵活地在运行时添加任意数量的装饰器。

3、总结

在本文中,我们了解了装饰器设计模式。在以下情况下这是一个不错的选择:
  • 当我们希望添加、增强甚至删除对象的行为或状态
  • 当我们只想修改类的单个对象的功能并保持其他对象不变
0条评论
0 / 1000
好****p
6文章数
2粉丝数
好****p
6 文章 | 2 粉丝
原创

设计模式之装饰模式

2023-10-07 06:58:35
10
0

1、前言

装饰器模式可用于静态或动态地将附加职责附加到对象。装饰器为原始对象提供了增强的接口。
在这种模式的实现中,我们更喜欢组合而不是继承——这样我们就可以减少为每个装饰元素一次又一次子类化的开销。此设计涉及的递归可用于根据需要多次装饰我们的对象。

2、装饰模式示例

假设我们有一个圣诞树对象并且我们想要装饰它。装饰并不改变物体本身;只是除了圣诞树之外,我们还添加了一些装饰物品,如花环、金属丝、树顶、泡泡灯等:
 

对于此场景,我们将遵循原始的“四人帮”设计和命名约定。首先,我们将创建一个 ChristmasTree 接口及其实现:
public interface ChristmasTree {
    String decorate();
}
该接口的实现如下所示:
public class ChristmasTreeImpl implements ChristmasTree {

    @Override
    public String decorate() {
        return "Christmas tree";
    }
}
 
我们现在将为这棵树创建一个抽象类 TreeDecorator 。该装饰器将实现 ChristmasTree 接口并保存ChristmasTree的对象。同一接口中实现的方法将简单地调用我们接口中的decorate()方法:
public abstract class TreeDecorator implements ChristmasTree {
    private ChristmasTree tree;
    
    // standard constructors
    @Override
    public String decorate() {
        return tree.decorate();
    }
}
我们现在将创建一些装饰元素。这些装饰器将扩展我们的抽象类 TreeDecorator ,并根据我们的要求修改其 Decorate() 方法:
public class BubbleLights extends TreeDecorator {

    public BubbleLights(ChristmasTree tree) {
        super(tree);
    }
    
    public String decorate() {
        return super.decorate() + decorateWithBubbleLights();
    }
    
    private String decorateWithBubbleLights() {
        return " with Bubble Lights";
    }
}
 
对于本例,以下情况为true:
@Test
public void whenDecoratorsInjectedAtRuntime_thenConfigSuccess() {
    ChristmasTree tree1 = new Garland(new ChristmasTreeImpl());
    assertEquals(tree1.decorate(), 
      "Christmas tree with Garland");
     
    ChristmasTree tree2 = new BubbleLights(
      new Garland(new Garland(new ChristmasTreeImpl())));
    assertEquals(tree2.decorate(), 
      "Christmas tree with Garland with Garland with Bubble Lights");
}

请注意,在第一个 tree1 对象中,我们仅用一个Garland装饰它,而另一个 tree2 对象我们用一个 BubbleLights 和两个Garland装饰。这种模式使我们能够灵活地在运行时添加任意数量的装饰器。

3、总结

在本文中,我们了解了装饰器设计模式。在以下情况下这是一个不错的选择:
  • 当我们希望添加、增强甚至删除对象的行为或状态
  • 当我们只想修改类的单个对象的功能并保持其他对象不变
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0