软件设计模式——装饰器模式
程序员文章站
2024-02-26 12:49:16
...
一、定义
装饰器模式是为已有的模式动态地添加额外的功能的一种模式。允许向一个现有的对象添加新的功能,但是不影响其结构。作为现有对象的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
二、设计类图
三、作用
一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
四、代码实现
/**
* 基础的接口
* @Author: aaa@qq.com
* @Date: 2019-11-12 09:22
*/
public interface Apple {
void res();
}
/**
* 实现接口具体的类
*
* @Author: aaa@qq.com
* @Date: 2019-11-12 09:23
*/
public class ConcreteApple implements Apple {
@Override
public void res() {
System.out.println("普通苹果");
}
}
/**
* 装饰器基类
*
* @Author: aaa@qq.com
* @Date: 2019-11-12 09:24
*/
public abstract class Decorator implements Apple {
protected Apple apple;
public Decorator(Apple apple) {
this.apple = apple;
}
@Override
public void res() {
apple.res();
}
}
/**
* 具体的装饰类的实现类
*
* @Author: aaa@qq.com
* @Date: 2019-11-12 09:26
*/
public class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Apple apple) {
super(apple);
}
public void resA() {
System.out.println("被装饰器A扩展的功能,我是红色的苹果.");
}
@Override
public void res() {
super.res();
//在重写原有方法时 装饰了一个resA方法
resA();
}
}
/**
* 具体的装饰类的实现类
*
* @Author: aaa@qq.com
* @Date: 2019-11-12 09:27
*/
public class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Apple apple) {
super(apple);
}
public void resB() {
System.out.println("被装饰器B扩展的功能,我是绿色的苹果.");
}
@Override
public void res() {
super.res();
resB();
}
}
/**
* 主类测试
*
* @Author: aaa@qq.com
* @Date: 2019-11-12 09:28
*/
public class Main {
public static void main(String[] args) {
Apple apple = new ConcreteApple();
//原来的方法
apple.res();
//装饰出红色的苹果
ConcreteDecoratorA decoratorA = new ConcreteDecoratorA(apple);
decoratorA.res();
//装饰后的方法 装饰出绿色的苹果
ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(apple);
decoratorB.res();
}
}
输出结果:
普通苹果
普通苹果
被装饰器A扩展的功能,我是红色的苹果.
普通苹果
被装饰器B扩展的功能,我是绿色的苹果.
上一篇: mybatis多个接口参数的注解使用方式(@Param)
下一篇: Mysql 启动报1067错误