首页 > 编程语言 >Java设计模式 —— 装饰模式

Java设计模式 —— 装饰模式

时间:2022-10-19 00:23:33浏览次数:104  
标签:Java 对象 component 模式 public operation 设计模式 装饰

12 装饰模式

12.1 装饰模式概述

Decorator Pattern: 动态地给一个对象增加一些额外的职责。提供一种比使用子类更加灵活的方案来扩展功能。

装饰模式是一种用于替代继承的技术,通过一种无须定义子类的方式给对象动态增加职责,使用对象之间的关联关系替代类之间继承关系。

装饰模式结构图如下所示:

12.2 装饰模式实现

12.2.1 抽象构件类

它是具体构件类和抽象装饰类的共同父类,它的引入使得客户端可以以一致的方式处理未装饰的对象和已装饰的对象,实现客户端的透明操作。

public abstract class Component {
  public abstract void operation();
}

12.2.2 具体构件类

实现抽象构件中声明的方法,装饰类可以给它增加额外的方法。

public class ConcreteComponent extends Component {
  public void operation() {
    // 业务代码
  }
}

12.2.3 抽象装饰类

用于给具体构件类增加职责,但是具体增加的职责在其子类中实现。

public class Decorator extends Component {
  private Component component;
  
  public Decorator(Component component) {
    this.component = component;
  }
  
  public void operation() {
    // 调用原有业务方法
    component.operation();
  }
}

12.2.4 具体装饰类

负责向具体构件中添加新的职责。

public class ConcreteDecorator extends Decorator {
  public concreteDecorator(Component component) {
    super(component);
  } 
  
  public void operation() {
    super.operation();
    
    // 新增的职责
    addMethod();
  }
  
  public void addMethod() {
    // 新增职责逻辑
  }
}

12.2.5 客户端调用

public class Client {
  public static void main(String[] args) {
    Component component, decorator;
    component = new ConcreteComponent();
    decorator = new ConcreteDecorator(component);
    
    // 一致的方式处理未装饰的对象和已装饰的对象
    componet.operation();
    decorator.operation();
  }
}

12.3 透明装饰模式与半透明装饰模式

12.3.1 透明装饰模式

上述装饰模式的实现即为透明装饰模式,要求客户端完全针对抽象编程。装饰模式的透明性要求客户端程序将对象声明为抽象构件类型,可以一致的处理装饰对象和未装饰对象。

但是在某些情况下,有些新增行为需要单独被调用,此时如果使用透明装饰模式,则无法一致的处理装饰前的对象和装饰后的对象(装饰后的对象需要强制类型转换调用新增行为)。

12.3.2 半透明装饰模式

为了能够调用到新增的方法,不得不用具体装饰类型来定义装饰之后的对象,而具体构件对象可以使用抽象构件声明,这种装饰模式则称为半透明

public class Client {
  Component component;
  component = new ConcreteComponent();
  component.operation();
  
  ConcreteDecorator decorator = new ConcreteDecorator(component);
  decorator.operation();
  decorator.addMethod();
}

半透明模式可以给系统带来更多的灵活性,使用起来也非常方便;但是其缺点是客户端需要区别的对象装饰对象和未装饰对象。

12.4 装饰模式优/缺点

使用场景:Java I/O 输入流和输出流

装饰模式的优点主要如下:

  • 对于扩展一个类的功能,装饰模式比继承更加灵活
  • 可以对一个对象进行多次装饰,通过使用不同的装饰类得到功能更强大的对象
  • 具体构件类和具体装饰类可以独立变化,用户根据需要增加新的构件类和装饰类,无须修改原有代码,符合开闭原则

装饰模式的缺点主要如下:

  • 装饰模式提供了一种比继承更灵活的方式,同时也比继承更加易于出错,排错也更加困难,对于多次装饰的对象

标签:Java,对象,component,模式,public,operation,设计模式,装饰
From: https://www.cnblogs.com/ylyzty/p/16804735.html

相关文章

  • 设计模式 - 动态代理
    设计模式-动态代理什么是代理代购、中介、商家举个栗子:比如有一家美国大学,面向全世界招生,而我们国内的同学,需要去到某个大学。因为我们所处国内,并不知道这个大学......
  • Java云原生崛起微服务框架Quarkus入门实践
    @目录概述定义GraalVM简介为何使用特性官方性能实战入门示例步骤安装GraalVM创建quarkus工程Idea导入项目Idea运行和调试打包成普通的Jar打包成依赖GraalVM二进制文件打包......
  • java -jar 启动带有参数
    java-Xms512M-Xmx512M-Dserver.port=8700-Dspring.config.location=/iflytek/conf/wm-2.1.0/wm-rest.properties-Deureka.client.serviceUrl.defaultZone=http://10......
  • Java中使用List的add方法后元素相同问题
    在写JavaWeb时,我在后端通过JDBC读取了数据后逐个使用List.add()方法添加元素并通过request方法传给jsp页面解析,但是添加以后出现了在列表里有n个(假设添加了n个元素)最后一个......
  • Java动态绑定机制
    本文主要记录韩顺平老师讲解动态绑定机制过程中提到的重点,本文转载此篇博客【Java】动态绑定机制,并对其进行一定的补充,如有侵权会删除。特点当调用对象方法的时候,该方法......
  • Java 集合简介 一
    什么是集合?集合就是由若干个确定的元素所构成的整体。例如,5只小兔构成的集合:在数学中,我们经常遇到集合的概念。例如:●有限集合○一个班所有的同学构成的集合;○一......
  • JavaScript学习--Array数组对象
    定义1.var变量名=newArray(元素列表);如vararr=newArray(1,2,3);2.常用:var变量名=[元素列表];如vararr=[1,2,3];访问arr[索引]=值;如arr[0]=1;ps:数组长度类型均可变 len......
  • JavaScript学习--基础语法03
    流程控制语句if,switch,for,while,dowhile。与之前学过的一样。 函数定义:通过function关键词定义语法:functionfunctionName(参数1,参数2) {  具体代码 }例子fu......
  • JavaScript学习--03
    运算符除了==和===其他和c语言都一样==:1.判断类型是否一样,如果不一样,则进行类型转换2.再去比较其值===:全等于1.判断类型是否一样,如果不一样,直接返回fa......
  • javaSE基础-抽象
    抽象(abstract)java关键字abstract,可用于修饰类、方法。抽象类格式:修饰符abstractclass类名{}1、此类不能实例化2、抽象类中一定有构造器,便于子类实例化时调用3、......