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

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

    优点

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

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

     

  • 相关阅读:
    [No0000C9]神秘的掐指一算是什么?教教你也会
    [No0000C8]英特尔快速存储IRST要不要装
    [No0000C7]windows 10桌面切换快捷键,win10
    [No0000C6]Visual Studio 2017 函数头显示引用个数
    [No0000C4]TortoiseSVN配置外部对比工具
    [No0000C5]VS2010删除空行
    [No0000C3]StarUML2 全平台破解方法
    [No0000C2]WPF 数据绑定的调试
    [No0000C1]Excel 删除空白行和空白列VBA代码
    [No0000C0]百度网盘真实地址解析(不用下载百度网盘)20170301
  • 原文地址:https://www.cnblogs.com/runningRookie/p/14348229.html
Copyright © 2011-2022 走看看