23种设计模式(装饰模式)
一、装饰模式理解
动态地给一个对象添加一些额外的职责(再不改变原有对象的基础上) 结构图如下:
二、直接上代码
- Component抽象类
Component是一个接口或是抽象类,就是定义我们最核心的对象,也就是最原始的对象。
package com.xiao.jiegouxing.decorator;
public interface Component {
void operation();
}
2.ComponentImpl类
具体构件,通过继承实现Component抽象类中的抽象方法。是最核心、最原始、最基本的接口或抽象类的实现,我们要装饰的就是它。
package com.xiao.jiegouxing.decorator;
public class ComponentImpl implements Component {
@Override
public void operation() {
System.out.println("拍照");
}
}
- Decorator装饰类
一般是一个抽象类,在其属性里必然有一个private变量指向Component抽象构件。
package com.xiao.jiegouxing.decorator;
abstract class Decorator implements Component {
Component component;
public Decorator(Component component){
this.component = component;
}
}
4. DecoratorImpl类
可以写多个具体实现类,把最核心的、最原始的、最基本的东西装饰成其它东西。
package com.xiao.jiegouxing.decorator;
class DecoratorImpl extends Decorator{
public DecoratorImpl(Component component){
super(component);
}
@Override
public void operation() {
System.out.println("添加美颜");
component.operation();
}
}
- Client客户端
package com.xiao.jiegouxing.decorator;
public class Test {
public static void main(String[] args) {
Component component = new DecoratorImpl(new ComponentImpl());
component.operation();
}
}
> 6.结果
总结
1.使用
- 在不想增加很多子类的情况下扩展类时
- 方法
- 将具体功能职责划分,同时继承装饰者模式
- 优点
- 装饰类和被装饰类可以独立发展,而不会相互耦合。它有效地把类的核心职责和装饰功能分开了
- 装饰模式是继承关系的一个替代方案
- 装饰模式可以动态地扩展一个实现类的功能
4. 缺点
- 多层装饰比较复杂。
- 使用场景
- 需要扩展一个类的功能时
- 需要动态地给一个对象增加功能,并可以动态地撤销时
需要为一批的兄弟类进行改装或加装功能时