zoukankan      html  css  js  c++  java
  • 设计模式(四)之装饰者模式

    时空链接:

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

    测试结果如下:

    充满鲜花的世界到底在哪里
  • 相关阅读:
    使用cwRsync在Windows的目录之间增量同步文件
    Linux搭建lnmp环境
    ie下文件上传无权访问的问题
    10
    8
    9
    7
    网络爬虫环境配置之的模块安装
    pip的更新问题
    【转】进程与线程的一个简单解释
  • 原文地址:https://www.cnblogs.com/aliases/p/13504685.html
Copyright © 2011-2022 走看看