装饰者模式概念:
装饰者模式又名包装(Wrapper)模式。装饰者模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
装饰者模式动态地将责任附加到对象身上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
装饰模式的结构
装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰者模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。
装饰者模式UML类图:
装饰者模式类图
装饰者模式中的角色有:
- 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
- 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。
- 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
- 具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。
装饰模式实例演示:
儿子、妈妈、父亲三人合作画一幅画,儿子负责画出一朵花的轮廓,妈妈负责涂上颜色、父亲负责将画裱在画框里。请编写程序模拟这个过程。UML类图如下:
UML
代码实现:
接口类:
public interface Painter {
public void draw();
}
具体构建son类:
public class Son implements Painter {
@Override
public void draw() {
System.out.println("我是儿子,我花了花的轮廓");
}
}
抽象角色Decorater类:
public abstract class Decorator implements Painter {
private Painter painter;
public Decorator(Painter painter) {
this.painter = painter;
}
public void draw() {
painter.draw();
}
}
具体装饰角色mother:
public class Mother extends Decorator {
public Mother(Painter painter) {
super(painter);
}
public void draw() {
super.draw();
System.out.println("Mother Draw");
this.color();
}
public void color(){
System.out.println("我是妈妈,我给画涂色");
}
}
具体装饰角色father:
public class Father extends Decorator {
public Father(Painter painter) {
super(painter);
}
public void draw() {
super.draw();
System.out.println("Father Draw");
this.mounting();
}
public void mounting(){
System.out.println("我是爸爸,我将画裱起来");
}
}
实现类:
public class Application {
public static void main(String[] args) {
Painter son = new Son();
son.draw();
Decorator son1=new Mother(son);
son1.draw();
Decorator son2=new Father(son);
son2.draw();
//System.out.println();
}
}
运行结果:
result.png
装饰者模式的优缺点
装饰者模式的优点:
- 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。装饰模式允许系统动态决定“贴上”一个需要的“装饰”,或者除掉一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了。
- 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
装饰者模式的缺点:
- 由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。
网友评论