天天看点

《设计模式修炼真经》11 — 装饰模式

1、定义

装饰模式的定义:在不改变现有对象结构的情况下,动态地给该对象增加一些职责(增加其额外功能);

装饰模式是一种非常常见的设计模式;在软件开发过程中,有时想用一些现存的组件,这些组件可能只完成了一些核心功能,如果想要在不改变其结构的情况下动态地扩展其功能,这个时候就可以采用装饰模式;

2、类图

装饰模式的通用类图如下:

《设计模式修炼真经》11 — 装饰模式

装饰模式主要包括以下四种角色:

  • 抽象组件(Component):是一个接口或者是抽象类,定义核心的功能,也就是最原始的对象;
  • 具体组件(ConcreteComponent):是最核心、最原始、最基本的接口或抽象类的实现,也是要装饰的对象;
  • 抽象装饰者(Decorator):一般是一个抽象类,实现了Component的接口或者抽象方法,它里面不一定有抽象方法但必然有一个私有变量指向Component抽象组件;
  • 具体装饰者(ConcreteDecorator):具体的装饰类,把ConcreteComponent装饰成其他东西;

3、代码实现

装饰模式 的Java代码实现如下:

//抽象组件
public abstract class Component {
  //抽象的方法
  public abstract void operate();
}

//具体组件
public class ConcreteComponent extends Component {
  @Override
  public void operate() {
    ...
  }
}

//抽象装饰者
public abstract class Decorator extends Component {
  //一个Component的私有变量
  private Component component = null;
  //通过构造函数传递被修饰者
  public Decorator(Component _component){
  this.component = _component;
  }
  //委托给被修饰者执行
  @Override
  public void operate() {
    this.component.operate();
  }
}

//具体的装饰者
public class ConcreteDecorator1 extends Decorator {
  //定义被修饰者
  public ConcreteDecorator1(Component _component){
    super(_component);
  }
  //定义自己的修饰方法
  private void method1(){
    ...
  }
  //重写父类的Operation方法
  public void operate(){
    this.method1();
    super.operate();
  }
}
public class ConcreteDecorator2 extends Decorator {
  //定义被修饰者
  public ConcreteDecorator2(Component _component){
    super(_component);
  }
  //定义自己的修饰方法
  private void method2(){
    ...
  }
  //重写父类的Operation方法
  public void operate(){
    super.operate();
    this.method2();
  }
}

//使用举例
public class Client {
  public static void main(String[] args) {
    Component component = new ConcreteComponent();
    //第一次修饰
    component = new ConcreteDecorator1(component);
    //第二次修饰
    component = new ConcreteDecorator2(component);
    //修饰后运行
    component.operate();
  }
}      

4、特点

优点:

1、装饰是继承的有力补充,比继承灵活

装饰模式可以在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用;

2、通过使用不同装饰类及这些装饰类的排列组合,可以实现不同效果;

3、装饰类和被装饰类可以独立发展,而不会相互耦合;

4、装饰器模式完全遵守开闭原则;

缺点:

装饰模式会增加许多子类,过度使用会增加程序的复杂性,尤其是多层装饰的情况下;

5、适用场景

装饰模式通常适用于以下场景:

1、当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。

例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。

2、当需要通过对现有的一组基本功能进行排列组合而产生更多功能时,采用继承关系很难实现,而采用装饰器模式却很好实现;

3、当对象的功能要求可以动态地添加,也可以再动态地撤销时;

我的视频课

下面是我录制的一些视频课,欢迎大家围观~

​《设计模式修炼真经》​ 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结,代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 本套课程深入介绍了经典的23种设计模式,并加入了自己的感悟,希望大家能够彻底掌握设计模式,写出最好的代码,达到无招胜有招的境界,最终超越这23种设计模式。

《彻底搞定JVM》​ JVM是Java中重要的也是较难理解的内容; 面试者对JVM的了解程度某种程度上反映了面试者技术深度,所以JVM也是面试时经常考察的内容; 本课程从JVM运行流程、数据运行时区域组成部分、类加载机制、垃圾回收机制、内存模型、常见面试题讲解等角度出发,帮你彻底搞定JVM,拿下心仪Offer;

《Android性能优化参考》 本课程包含了Android中的App启动优化、UI优化、内存优化、图片优化、耗电量等常见的性能优化场景,通过学习此课程,你将对整个Android性能优化体系有清晰的认识。

性能优化作为Android高级开发的必备技能,也是大厂面试必考的题目,是体现一个人技术深度最好的试金石。

《面试之排序算法》 排序算法是我们面试被问到最多的基础算法,本课程详细介绍了七种排序算法,包括插入排序、选择排序、冒泡排序、谢尔排序、快速排序、堆积排序和二路并归排序。每种算法都详细介绍了核心思想、详细步骤、时间复杂度和代码实现,希望帮助大家深入理解排序算法,搞定面试!

《Android HyBrid App开发实战》 本课程为Android HyBrid App开发实战课程,由浅入深,从三种App的历史和特点开始,介绍了Android WebView的使用、Java和JS交互的原生方式、著名的WebView安全漏洞、JSBridge的原理和使用,最后通过一个网上商城的实战综合全部内容,让同学们掌握并深入理解Android HyBrid App开发。

《AI导论》​ 介绍人工智能AI的诞生历史和到现在为止的不同发展阶段;介绍了AI领域中常见的名词概念和其关系,包括机器学习、深度学习、神经网络结构搜索 NAS、生成对抗网络 GAN等;最后对AI发展做出展望。 本课程属于导论课程,旨在帮助同学们从宏观层面把握AI,建立AI的知识体系。

《Java注解精讲》​ 本课程详细介绍了Java中的注解机制,包括注解的定义和分类,注解的使用和自定义,注解的源码和架构分析; 本课程语言简单凝练,视频短小精悍,让你一次彻底搞懂Java注解!

《Java反射精讲》​ 反射是Java中重要的也是较难理解的内容;

本课程从反射的定义、作用、原理和使用出发,全方位帮你彻底搞定反射;

您的点赞是我前进的动力~