• 装饰模式


    装饰器模式概述

    装饰器模式也称为包装模式,适用于在不改变原有类的情况下,增强类对象的功能

    UML

    结构

            组件接口:定义组件应有的功能
            具体组件:实现了组件接口,需要被装饰的对象
            装饰器:抽象类,引用和实现组件接口,默认调用组件类的operation方法,也可在组件原有功能的基础上进行增强
            具体装饰类:继承自装饰器抽象类,通过重写组件类的operation方法,增强其功能并调用父类的operation方法

    代码

    package com.hpp.decorator;
    
    public interface Component {
    	public void operation();
    }
    package com.hpp.decorator;
    // 具体的组件类
    public class ConcreteComponent implements Component {
    	@Override
    	public void operation() {
    		System.out.println("正常操作");
    	}
    }
    package com.hpp.decorator;
    // 装饰类, 继承Component接口, 并声明使用一个Component实例
    public abstract class Decorator implements Component {
    	Component component;
    
    	public void setComponent(Component component) {
    		this.component = component;
    	}
    
    	@Override
    	public void operation() {
    		component.operation();
    	}
    }
    package com.hpp.decorator;
    
    //继承了装饰类的 具体的装饰器类A
    public class ConcreteDecoratorA extends Decorator {
    	@Override
    	public void operation() {
    		// 装饰的代码
    		System.out.println("封装数据为指定格式");
    		// 执行完上面的装饰逻辑后, 再调用传入的原组件类方法
    		super.operation();
    	}
    }
    package com.hpp.decorator;
    // 继承了装饰类的 具体的装饰器类B
    public class ConcreteDecoratorB extends Decorator {
    	@Override
    	public void operation() {
    		System.out.println("执行记录日志操作");
    		super.operation();
    	}
    }
    package com.hpp.decorator;
    
    public class TestMain {
    	public static void main(String[] args) {
    		Component c = new ConcreteComponent();
    		Decorator decoratorA = new ConcreteDecoratorA();
    		Decorator decoratorB = new ConcreteDecoratorB();
    		// 对组件对象进行B装饰
    		decoratorB.setComponent(c);
    		// 对已经装饰上B的对象进行装饰
    		decoratorA.setComponent(decoratorB);
    		// 执行最后的装饰结果
    		decoratorA.operation();
    	}
    }

    最终输出的结果:
        封装数据为指定格式
        执行记录日志操作
        正常操作

    优点

    将装饰功能从原有类中抽离出来,能在不修改原有类的基础上增强其功能,而每个具体装饰器只需关心自己的功能。

    才疏学浅,如文中有错误,感谢大家指出。

     

  • 相关阅读:
    Flask17 Flask_Script插件的使用
    python导入模块被加横线
    MYSQL中replace into的用法
    flask通过nginx代理后base_url拿不到正确的url_scheme2016-04-14 12:31
    nginx+Gunicorn部署你的Flask项目
    浅谈flask源码之请求过程
    浅谈Flask 中的 线程局部变量 request 原理
    flask基础之jijia2模板语言进阶(三)
    Redis在windows下安装过程
    如何打开Intellij IDEA的代码提示功能/联想/自动联想
  • 原文地址:https://www.cnblogs.com/runningRookie/p/14348229.html
Copyright © 2020-2023  润新知