陆小叁
这是一个充满鲜花的世界

时空链接:

  1. 设计模式(一)之策略模式
  2. 设计模式(二)之责任链模式
  3. 设计模式(三)之模板模式
  4. 设计模式(四)之装饰者模式
  5. 设计模式(五)之适配器模式
  • 所有关于设计模式的代码,都会托管到:设计模式代码,欢迎关注。

装饰者模式

概念

  1. 装饰者模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构模式,它是作为现有类的一个包装。

  2. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整的情况下,提供了额外的功能。

特点(模式定义)

  • Component(抽象构件):它是装饰类和具体构件的公共父类。
  • ConcreteComponent(具体构件):它是抽象构件对象的子类,用来定义具体的构件对象。
  • Decorator(抽象装饰类):持有对具体构件角色的引用并定义与抽象构件角色一致的接口。
  • ConcreteDecorator(具体装饰类):实现抽象装饰类,它负责向构件添加新的职责。

使用场景

  1. 扩展一个类的功能。
  2. 动态增加功能,动态撤销。

优缺点

  • 优点:
    装饰类和被装饰类可以独立扩展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

  • 缺点:
    会出现更多的类,使程序更加复杂。

模式的结构

    请参照该类图(图片来自网络):

  1. Shape代表抽象构件(相当于本文中GatewayComponent)。
  2. Circle、Reactangle代表具体构件(相当于本文中IpOrOriginBlackDecorator)。
  3. ShapeDecorator代表抽象装饰类(相当于本文中AbstractDecorator)。
  4. RedShapeDecorator代表具体装饰类(相当于本文中LogDecoratorAccessControlDecorator)。

开发步骤

  • 定义抽象构件
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();
    }
}


测试结果如下:

posted on 2020-08-14 21:47  陆小叁  阅读(309)  评论(0编辑  收藏  举报