Java装饰器模式详解(定义优缺及使用实例)

Java装饰器模式详解(定义优缺及使用实例)-mikechen

Java装饰器模式是常见的Java设计模式用途非常的广,下面我就重点详解Java装饰器模式的实现与使用@mikechen

Java装饰器模式定义

Java装饰器模式是Java设计模式的一种结构型模式,它通过包装原始对象来扩展其功能,而不是通过创建子类来实现。

 

Java装饰器模式作用

Java装饰器模式的主要作用是在不改变对象接口的情况下,动态地为一个对象添加额外的功能。

 

Java装饰器模式优缺点

Java装饰器模式的优点包括:

  1. 扩展对象功能:装饰器模式允许动态地为对象添加新的行为,而无需修改现有代码。
  2. 遵循开放封闭原则:装饰器模式遵循开放封闭原则,允许扩展对象的功能而不必修改现有代码。
  3. 遵循单一职责原则:装饰器模式允许将对象的功能划分到不同的装饰器类中,从而遵循单一职责原则。
  4. 避免创建大量子类:使用装饰器模式可以避免创建大量子类来扩展对象的功能,从而提高代码的可维护性和可读性。

 

Java装饰器模式的缺点包括:

  1. 增加复杂度:使用装饰器模式会增加代码的复杂度和理解难度,需要仔细考虑类之间的关系和功能的组合方式。
  2. 处理顺序:装饰器模式中,装饰器类的调用顺序可能会影响最终的结果,需要特别注意。
  3. 运行时开销:装饰器模式需要在运行时动态创建对象,可能会导致一定的运行时开销。

 

Java装饰器模式实例

Java装饰器模实现,主要有四个主要的角色:

Java装饰器模式详解(定义优缺及使用实例)-mikechen

首先:我们定义一个接口Component(抽象构件)

它包含一个抽象的方法operation(),表示对象的基本操作。

public interface Component {
    void operation();
}

 

其次:定义具体的实现构件(ConcreteComponent )

接下来,我们实现一个具体的Component类,它表示对象的基本功能。

public class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("ConcreteComponent.operation()");
    }
}

 

再次:定义装饰器Decorator

接下来,我们定义一个装饰器Decorator,它也实现Component接口,并包含一个Component类型的成员变量,用于保存被装饰对象的引用。

public abstract class Decorator implements Component {
    protected Component component;

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

    @Override
    public void operation() {
        component.operation();
    }
}

 

接着:具体的装饰器类

接下来,我们实现具体的装饰器类。

public class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        System.out.println("ConcreteDecoratorA.operation()");
    }
}

public class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        System.out.println("ConcreteDecoratorB.operation()");
    }
}

例如:ConcreteDecoratorA和ConcreteDecoratorB,它们用于为对象添加额外的功能

 

最后,我们可以使用装饰器来动态地为对象添加额外的功能。

Component component = new ConcreteComponent();
component.operation();

component = new ConcreteDecoratorA(component);
component.operation();

component = new ConcreteDecoratorB(component);
component.operation();

运行结果如下:

ConcreteComponent.operation()
ConcreteDecoratorA.operation()
ConcreteDecoratorB.operation()

以上就是Java装饰器模式详解,更多设计模式请查看:Java设计模式:23种设计模式(万字图文全面总结)

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法