本文目录导读:
装饰器模式是一种结构型设计模式,它允许在不修改原始类代码的情况下,通过使用继承和组合的方式,动态地为对象添加新的功能,这种模式通常用于扩展一个类的功能,而不需要改变其接口,本文将详细介绍装饰器模式的原理、实现方式以及在评测编程中的应用。
装饰器模式的基本概念
1、装饰器模式定义:装饰器模式是一种结构型设计模式,它允许在不修改原始类代码的情况下,通过使用继承和组合的方式,动态地为对象添加新的功能,这种模式通常用于扩展一个类的功能,而不需要改变其接口。
2、装饰器模式的作用:装饰器模式可以在运行时动态地为对象添加新的功能,而不需要修改原有的代码,这样可以提高代码的可扩展性和可维护性,同时也可以避免引入不必要的修改和破坏。
3、装饰器模式的关键角色:
- 抽象组件(Component):定义了一个公共的方法接口,使得子类可以通过继承和实现这些方法来扩展功能。
- 具体组件(ConcreteComponent):实现了抽象组件中定义的方法接口,是实际的功能实现者。
- 抽象装饰器(Decorator):也是一个抽象组件,它也有一个抽象组件作为成员变量,并通过调用其抽象方法来实现具体的功能。
- 具体装饰器(ConcreteDecorator):实现了抽象装饰器中定义的方法接口,是对具体组件进行功能的扩展。
装饰器模式的实现方式
1、抽象组件:定义了一个公共的方法接口,使得子类可以通过继承和实现这些方法来扩展功能,我们可以定义一个抽象的计算机类,包含加法、减法、乘法和除法等基本运算方法。
public abstract class Computer { public abstract int add(int a, int b); public abstract int subtract(int a, int b); public abstract int multiply(int a, int b); public abstract int divide(int a, int b); }
2、具体组件:实现了抽象组件中定义的方法接口,是实际的功能实现者,我们可以创建一个具体的计算机类,实现了抽象计算机类中定义的基本运算方法。
public class ConcreteComputer extends Computer { @Override public int add(int a, int b) { return a + b; } @Override public int subtract(int a, int b) { return a - b; } @Override public int multiply(int a, int b) { return a * b; } @Override public int divide(int a, int b) { if (b == 0) { throw new IllegalArgumentException("除数不能为0"); } return a / b; } }
3、抽象装饰器:也是一个抽象组件,它也有一个抽象组件作为成员变量,并通过调用其抽象方法来实现具体的功能,我们可以创建一个抽象的计算器类,包含一个计算器抽象组件作为成员变量,并提供了一个设置计算器的方法。
public abstract class Calculator extends Computer implements Decorator { protected Computer computer; public Calculator(Computer computer) { this.computer = computer; } @Override public int add(int a, int b) { return computer.add(a, b); } }
4、具体装饰器:实现了抽象装饰器中定义的方法接口,是对具体组件进行功能的扩展,我们可以创建一个具体的加法计算器类,继承自计算器抽象类,并重写了其方法接口,这样,当我们需要对计算器的加法功能进行扩展时,只需要创建一个新的具体加法计算器类即可。
public class AddCalculator extends Calculator implements Decorator { private Calculator calculator; public AddCalculator(Computer computer) throws IllegalArgumentException { super(computer); if (!(computer instanceof IntegerCalculator)) { throw new IllegalArgumentException("只能使用整数类型的计算机进行加法运算"); } } @Override int add(int a, int b) throws IllegalArgumentException { return ((IntegerCalculator) computer).add(a, b) + super.add(a, b); // 对整数类型的计算机进行加法运算后,再加上原来的结果作为最终结果返回 } }