Java 设计模式之装饰器学习与掌握
Posted 邹奇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 设计模式之装饰器学习与掌握相关的知识,希望对你有一定的参考价值。
定义
- 指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
优点
- 装饰器模式完全遵守开闭原则
- 通过使用不同装饰类及这些装饰类的排列组合,可以实现不同效果
- 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
缺点
- 装饰器模式会增加许多子类,过度使用会增加程序得复杂性。
装饰器模式的结构与实现
使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰器模式的目标。
模式结构
包含角色如下:
- 【抽象构件角色】定义一个抽象接口以规范准备接收附加责任的对象。
- 【具体构件角色】实现抽象构件,通过装饰角色为其添加一些职责。
- 【抽象装饰角色】实现抽象构件接口,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
- 【具体装饰角色】继承抽象装饰,并给具体构件对象添加附加的责任来达到扩展具体构件的功能。
模式实现
抽象构件接口,代码如下:
package com.example.designmodedemo.principle.decorator;
/**
* 抽象构件
*/
public interface Component {
void handle();
}
具体构件,代码如下:
package com.example.designmodedemo.principle.decorator;
/**
* 具体构件:实现抽象构件接口
*/
public class ComponentImpl implements Component{
public ComponentImpl() {
System.out.println(":> 创建具体构件");
}
@Override
public void handle() {
System.out.println(":> 调用具体构件的 handle 方法");
}
}
抽象构件装饰,代码如下:
package com.example.designmodedemo.principle.decorator;
/**
* 抽象角色装饰
*/
public class Decorator implements Component{
private Component component;
public Decorator(Component component){
this.component = component;
}
@Override
public void handle() {
component.handle();
}
}
具体构件装饰,代码如下:
package com.example.designmodedemo.principle.decorator;
/**
* 具体构件装饰
*/
public class MyDecorator extends Decorator {
public MyDecorator(Component component) {
super(component);
}
public void handle(){
super.handle();
addHandle();
}
private void addHandle() {
System.out.println(":> 为具体构件增加新的处理逻辑功能");
}
}
客户端,调用代码如下:
/**
* 装饰器模式
*/
private void principle_decorator() {
// 创建具体构件对象
Component component = new ComponentImpl();
// 创建具体构件装饰器对象,将具体构件对象构造传参进去
Decorator decorator = new MyDecorator(component);
// 装饰器对象处理(这里可扩展具体构件对象方法,新增需要的处理逻辑)
decorator.handle();
}
运行结果如下图:
应用场景
装饰器模式通常在以下几种情况使用:
- 当对象的功能要求可以动态地添加,也可以再动态地撤销时。
- 当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。
- 当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时,采用继承关系很难实现,而采用装饰器模式却很好实现。
技术永不眠!我们下期见!
以上是关于Java 设计模式之装饰器学习与掌握的主要内容,如果未能解决你的问题,请参考以下文章