动态地给一个对像添加一些额外的职责;是继承关系的一个替代方案
有效区分出:装饰性逻辑代码 ,与核心代码
可以形成链式装饰。
涉及角色:
抽象构件(Component)角色: 一个对象的接口,可以给这些对象添加装饰代码!(可无)
具体构件(Concrete Component)角色:具体的对象。也可以给它添加装饰代码
抽象装饰(Decorator)角色:也是Component的实现, (可无)
具体装饰(Concrete Decorator)角色:负责给构件对象,增加附加的功能。
何时使用:
当系统需要增加新功能,向旧的类中添加新的代码,而新增的代码只是用于装饰原有类的核心代码或主要功能,或在哪特定情况下才会执行的特殊行为需要,这时装饰模式是非常好的解决方案。
优点与缺点
优点:可以把类中的装饰性代码或功能人类中搬移出来,简化原有的类。
故事说明:
DECORATOR—Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?
装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。
Component抽象装饰类
public interface Component {
public void display();
}
Component具体被装饰类
public class Window implements Component {
@Override
public void display() {
System.out.println("This is window!");
}
}
Decorator 抽象装饰类
public class Decorator implements Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void display() {
component.display();
}
}
DecoratorA 具体装饰类
package Decorator;
public class DecoratorA extends Decorator {
public DecoratorA(Component component) {
super(component);
}
public void setScollBar(){
System.out.println("外挂一个滚动条!");
}
@Override
public void display() {
setScollBar();
super.display();
}
}
DecoratorB具体装饰类
public class DecoratorB extends Decorator {
public DecoratorB(Component component) {
super(component);
}
@Override
public void display() {
setBorder();
super.display();
}
private void setBorder() {
System.out.println("外挂一个边框");
}
}
public static void main(String[] args) {
Component component = new Window();
component.display();
System.out.println("------装饰开始-------");
Decorator decoratorA = new DecoratorA(component);
decoratorA.display();
System.out.println("--------------");
Decorator decoratorB = new DecoratorB(decoratorA);
decoratorB.display();
}
打印:
This is window!
------装饰开始-------
外挂一个滚动条!
This is window!
--------------
外挂一个边框
外挂一个滚动条!
This is window!