zoukankan      html  css  js  c++  java
  • 装饰模式

    装饰器模式概述

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

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

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

    优点

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

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

     

  • 相关阅读:
    Servlet过滤器----Filter
    Servlet监听器详解及举例
    Servlet学习笔记(四)之请求转发与重定向(RequestDispatcher与sendRedirect)
    Servlet学习笔记(二)之Servlet路径映射配置、Servlet接口、ServletConfig、ServletContext
    Servlet学习笔记(三)之HttpServletResponse
    Servlet学习笔记(三)之HttpServletRequest
    Servlet学习笔记(一)之Servlet原理、初始化、生命周期、结构体系
    Python文件(File)及读写操作及生成器yield
    Python学习笔记摘要(一)类型 字符串 函数 列表 深浅拷贝
    Vue如何新建一个项目
  • 原文地址:https://www.cnblogs.com/runningRookie/p/14348229.html
Copyright © 2011-2022 走看看