设计模式之--装饰器模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_34394641/article/details/89071981

设计模式之–装饰器模式

简介:

本篇文章是介绍 23 中设计模式中的结构型设计模式中的装饰器模式.使用的是 Java 代码.

目录:

1.什么是装饰器模式

2.装饰器模式的使用场景和优点

3.装饰器模式的简单运用

1.什么是装饰器模式

定义:

  装饰模式是结构型设计模式之一, 其在不必改变类文件和使用继承的情况下, 动态地扩展一个对象的功能,是继承的替代方案之一. 它通过创建一个包装对象, 也是装饰来包裹真实的对象.

动态地给一个对象添加一个额外的职责, 就增加功能来说, 装饰模式比生成子类更灵活.

结构:

装饰模式结构

  • Component(抽象组件)

可以是接口或抽象类, 被装饰的原始对象.

  • ConcreteComponent(组件具体实现类)

Component的具体实现类, 被装饰的具体对象.

  • Decorator(抽象装饰者)

从外类拓展 Component类的功能, 但对于 Component 来说无须知道 Decorator 的存在. 在它的属性中必然有一个 private 变量指向 Component 抽象组件.

  • ConcreteDecorator(装饰者的具体实现)

抽象装饰者的具体实现.

2.装饰器模式的使用场景和优点

使用场景:

  • 在不影响其他对象的情况下, 以动态, 透明的方式给单个对象添加职责.
  • 需要动态地给一个对象增加功能, 这些功能可以动态地撤销.
  • 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统拓展和维护时.

优点:

  • 通过组合而非继承的方式, 动态地拓展一个对象的功能, 在运行时选择不同的装饰器, 从而实现不同的行为.
  • 有效避免了使用继承的方式拓展对象功能带来的灵活性差, 子类无限制扩张的问题.
  • 具体组件类与具体装饰类可以独立变化, 用户可以根据需要增加新的具体组件类和具体装饰类, 在使用时再对其进行组合, 原有代码无须改变, 符合开闭原则.

缺点:

  • 因为所有对象均继承与 Component ,所以如果 Component 内部结构发生改变, 则不可避免地影响所有子类(装饰者和被装饰者). 如果基类改变, 则势必影响对象的内部.
  • 比继承更加灵活机动的特性, 也同时意味着装饰模式比继承更容易出错, 排错也更困难. 所以只在必要的时候使用装饰模式

3.装饰器模式的简单运用

抽象组件


public interface Component {
    
    public void biu();
}

组件具体实现类


public class ConcretComponent implements Component {

    public void biu() {
        
        System.out.println("biubiubiu");
    }
}

抽象装饰者类


public class Decorator implements Component {

    public Component component;
    
    public Decorator(Component component) {
        
        this.component = component;
    }
    
    public void biu() {
        
        this.component.biu();
    }
}

装饰者具体实现类


public class ConcreteDecorator extends Decorator {

    public ConcreteDecorator(Component component) {

        super(component);
    }

    public void biu() {
        
        System.out.println("ready?go!");
        this.component.biu();
    }
}

客户端调用


Component component = new ConcreteDecorator(new ConcretComponent());
  component.biu();

猜你喜欢

转载自blog.csdn.net/sinat_34394641/article/details/89071981