装饰模式

装饰器模式概述

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

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

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

优点

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

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

 

posted @ 2019-12-29 11:08  runningRookie  阅读(37)  评论(0编辑  收藏  举报