装饰模式

装饰器模式概述

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

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

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

优点

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值