美文网首页js css html
设计模式之装饰器模式

设计模式之装饰器模式

作者: Tinyspot | 来源:发表于2023-02-14 23:11 被阅读0次

1. 装饰器模式(Decorator Pattern

1.1 基本概念

  • 装饰器模式也叫作包装器模式(Wrapper Pattern),指在不改变原有对象的基础上,动态地给一个对象添加一些额外的职责
  • 核心是在不改变原有类的基础上给类新增功能(类比俄罗斯套娃)
  • 可以随机组合
    • 例如,通过服饰组合出一个有个性的人完全可以有无数种方案,并非固定的

1.2 四个角色

  • 抽象组件(Component)是一个接口或者抽象类,定义装饰对象的行为
  • 具体组件(ConcreteComponent),被装饰者
  • 抽象装饰器(Decorator),持有被装饰器的引用
  • 具体装饰器(ConcreteDecorator)
image.png

1.3 适用场景

  • 扩展一个类的功能
  • 动态添加功能,动态撤销
  • 把对象传进去,随机组合

2. 示例

2.1 装饰模式

public abstract class AbstractComponent {
    protected abstract void operation();
}

// 具体组件
public class ConcreteComponent extends AbstractComponent {
    @Override
    protected void operation() {
        System.out.println("ConcreteComponent: do something...");
    }
}
// 装饰器
public abstract class AbstractDecorator extends AbstractComponent {
    // 组件
    protected AbstractComponent component;

    public AbstractDecorator(AbstractComponent component) {
        this.component = component;
    }

    @Override
    protected void operation() {
        if (component != null) {
            component.operation();
        }
    }
}

public class ConcreteDecoratorA extends AbstractDecorator {
    public ConcreteDecoratorA(AbstractComponent component) {
        super(component);
    }

    @Override
    protected void operation() {
        System.out.println("Concrete decorator A: First");
        super.operation();
        System.out.println("Concrete decorator A: End");
    }
}

public class ConcreteDecoratorB extends AbstractDecorator {
    public ConcreteDecoratorB(AbstractComponent component) {
        super(component);
    }

    @Override
    protected void operation() {
        System.out.println("Concrete decorator B: First");
        super.operation();
        System.out.println("Concrete decorator B: End");
    }
}
@Test
public void test() {
    ConcreteComponent component = new ConcreteComponent();
    AbstractDecorator decoratorA = new ConcreteDecoratorA(component);
    decoratorA.operation();
    AbstractDecorator decoratorB = new ConcreteDecoratorB(component);
    decoratorB.operation();
}

打印结果
Concrete decorator A: First
ConcreteComponent: do something...
Concrete decorator A: End
Concrete decorator B: First
ConcreteComponent: do something...
Concrete decorator B: End

2.2 装饰器装饰具体的装饰对象

@Test
public void test2() {
    ConcreteComponent component = new ConcreteComponent();
    AbstractDecorator decoratorA = new ConcreteDecoratorA(component);
    AbstractDecorator decoratorB = new ConcreteDecoratorB(decoratorA);
    decoratorB.operation();
}

打印结果
Concrete decorator B: First
Concrete decorator A: First
ConcreteComponent: do something...
Concrete decorator A: End
Concrete decorator B: End

3. 应用

3.1 Stream IO 流

  • 抽象组件:InputStream
  • 被装饰者:FileInputStream, ByteArrayInputStream
  • 装饰者组件:FilterInputSteam
  • 具体装饰:BufferedInputStream, DataInputStream
  • 示例:添加 Buffer 缓冲功能 InputStream is = new BufferedInputStream(new FileInputStream("path"));
image.png

相关文章

网友评论

    本文标题:设计模式之装饰器模式

    本文链接:https://www.haomeiwen.com/subject/oxdykdtx.html