设计模式(四)之装饰者模式

装饰者模式

概念

  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();
    }
}


测试结果如下:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37640410/article/details/108614038
今日推荐