时空链接:
- 所有关于设计模式的代码,都会托管到:设计模式代码,欢迎关注。
装饰者模式
概念
-
装饰者模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构模式,它是作为现有类的一个包装。
-
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整的情况下,提供了额外的功能。
特点(模式定义)
- Component(抽象构件):它是装饰类和具体构件的公共父类。
- ConcreteComponent(具体构件):它是抽象构件对象的子类,用来定义具体的构件对象。
- Decorator(抽象装饰类):持有对具体构件角色的引用并定义与抽象构件角色一致的接口。
- ConcreteDecorator(具体装饰类):实现抽象装饰类,它负责向构件添加新的职责。
使用场景
- 扩展一个类的功能。
- 动态增加功能,动态撤销。
优缺点
-
优点:
装饰类和被装饰类可以独立扩展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。 -
缺点:
会出现更多的类,使程序更加复杂。
模式的结构
请参照该类图(图片来自网络):
- Shape代表抽象构件(相当于本文中GatewayComponent)。
- Circle、Reactangle代表具体构件(相当于本文中IpOrOriginBlackDecorator)。
- ShapeDecorator代表抽象装饰类(相当于本文中AbstractDecorator)。
- RedShapeDecorator代表具体装饰类(相当于本文中LogDecorator、AccessControlDecorator)。
开发步骤
- 定义抽象构件
package com.lee.decorate.service;
/**
* @author zfl_a
* @Desc 网关组件-抽象构件(是装饰类和具体构件的公共父类)
* @date 2020/8/14
* @project springboot_design_pattern
*/
public abstract class GatewayComponent {
/**
* 定义公共的行为标准
*/
public abstract void accessManager();
}
- 定义具体构件
package com.lee.decorate.service.impl;
import com.lee.decorate.service.GatewayComponent;
/**
* @author zfl_a
* @Desc 具体附件:它是抽象构件对象的子类,用来定义具体的构件对象(被装饰者)
* @date 2020/8/14
* @project springboot_design_pattern
*/
public class IpOrOriginBlackDecorator extends GatewayComponent {
@Override
public void accessManager() {
System.out.println("【1、被装饰者】主要负责IP黑名单验证");
}
}
- 定义抽象装饰类
package com.lee.decorate.service;
import com.lee.decorate.service.GatewayComponent;
/**
* @author zfl_a
* @Desc 抽象装饰者:持有对具体构件角色的引用并定义与抽象接口角色一致的接口
* @date 2020/8/14
* @project springboot_design_pattern
*/
public class AbstractDecorator extends GatewayComponent {
public GatewayComponent gatewayComponent;
public AbstractDecorator() {
}
public AbstractDecorator(GatewayComponent gatewayComponent) {
this.gatewayComponent = gatewayComponent;
}
@Override
public void accessManager() {
if (gatewayComponent != null) {
gatewayComponent.accessManager();
}
}
}
- 定义具体装饰类
LogDecorator
package com.lee.decorate.service.impl;
import com.lee.decorate.service.AbstractDecorator;
import com.lee.decorate.service.GatewayComponent;
/**
* @author zfl_a
* @Desc 具体装饰者,实现抽象装饰者的角色,负责对具体构件添加额外的功能
* @date 2020/8/14
* @project springboot_design_pattern
*/
public class LogDecorator extends AbstractDecorator {
public LogDecorator(GatewayComponent gatewayComponent) {
super(gatewayComponent);
}
@Override
public void accessManager() {
super.accessManager();
System.out.println("【2、日志】主要集成了日志功能");
}
}
AccessControlDecorator
package com.lee.decorate.service.impl;
import com.lee.decorate.service.AbstractDecorator;
import com.lee.decorate.service.GatewayComponent;
/**
* @author zfl_a
* @Desc 具体装饰者,实现抽象装饰者的角色,负责对具体构件添加额外的功能
* @date 2020/8/14
* @project springboot_design_pattern
*/
public class AccessControlDecorator extends AbstractDecorator {
public AccessControlDecorator(GatewayComponent gatewayComponent) {
super(gatewayComponent);
}
@Override
public void accessManager() {
super.accessManager();
System.out.println("【3、权限检查】主要负责判断是否开启了权限和动态权限加载及匹配工作");
}
}
- 定义工厂测试类
package com.lee.decorate.factory;
import com.lee.decorate.service.GatewayComponent;
import com.lee.decorate.service.impl.AccessControlDecorator;
import com.lee.decorate.service.impl.IpOrOriginBlackDecorator;
import com.lee.decorate.service.impl.LogDecorator;
/**
* @author zfl_a
* @Desc 工厂
* @date 2020/8/14
* @project springboot_design_pattern
*/
public class GatewayFactory {
public GatewayComponent getGatewayCompoent(){
AccessControlDecorator accessControlDecorator = new AccessControlDecorator(new LogDecorator(new IpOrOriginBlackDecorator()));
return accessControlDecorator ;
}
public static void main(String[] args) {
// 测试
GatewayComponent gatewayCompoent = new GatewayFactory().getGatewayCompoent();
gatewayCompoent.accessManager();
}
}
测试结果如下:
充满鲜花的世界到底在哪里