装饰者模式

基本定义

       动态的给一个对象添加一些额外的职责,就增加功能来讲,装饰模式比生成子类跟家灵活。【DP】

何种情况使用?

        当系统需要新功能的时候,是向旧的类中中添加新的代码。这些新加的代码通常用装饰了原有类的核心职责或主要行为。

装饰模式的优点

        1、把类中的装饰功能从类中搬移去除,这样可以简化原有的的类。

        2、更大的好处在于有效的把类核心职责和装饰功能区分开来。而且可以去除相关类中重复的装饰逻辑。

UML


代码

Component
package com.bjsxt.decorator;

abstract class Component {

	public abstract void operation();
}
ConcreteComponent
package com.bjsxt.decorator;

public class ConcreteComponent extends Component {

	public void operation() {
		System.out.println("具体的操作对象");
	}
}


Decorator
package com.bjsxt.decorator;

abstract class Decorator extends Component {

	protected Component component = null;

	public Decorator(Component component) {
		this.component = component;
	}

	public void operation() {
		if(component != null){
			component.operation();
		}
	}
}
ConcreteDecoratorA
package com.bjsxt.decorator;

public class ConcreteDecoratorA extends Decorator {

	private String addState;
	
	public ConcreteDecoratorA(Component component) {
		super(component);
	}

	public void operation() {
		super.operation();
		addState = "New State";
		System.out.println("具体装饰对象A的操作");
	}
	
}
ConcreteDecoratorB
package com.bjsxt.decorator;

public class ConcreteDecoratorB extends Decorator {

	
	public ConcreteDecoratorB(Component component) {
		super(component);
	}

	public void operation() {
		super.operation();
		addBehavior();
		System.out.println("具体装饰对象B的操作");
	}

	private void addBehavior(){
		
	}
	
}
Agent
package com.bjsxt.decorator;

public class Agent {

	public static void main(String[] args) {
		ConcreteComponent concreteComponent = new ConcreteComponent();
		ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA(concreteComponent);
		ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB(concreteDecoratorA);
		concreteDecoratorB.operation();
	}
}


总结

1、优点

           1、装饰者模式可以提供比继承更多的灵活性

           2、可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。

           3、通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。

           4、具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。

2、缺点

           1、会产生很多的小对象,增加了系统的复杂性

           2、这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值