设计模式——Decorator装饰器模式
设计模式——Decorator装饰器模式
装饰器模式
装饰器模式(DecoratorPattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。同时,装饰器模式要做到对装饰类的使用者透明。
装饰器模式结构
Component:抽象组件角色,定义一组抽象的接口,规定这个被装饰组件都有哪些功能。
ConcreteComponent:实现这个抽象组件的所有功能。
Decorator:装饰器角色,持有一个Component对象实例的引用,定义一个与抽象组件一致的接口。
ConcreteDecorator:具体的装饰器实现者,负责实现装饰器角色定义的功能。
举例
我们拿德云社说相声的于谦来举例,他可以说相声,抽烟喝酒烫头。。。
首先建立一个接口,德云社有说相声的功能。
Deyunshe.java
public interface Deyunshe {
void Shuoxiangsheng();
}
接口的实现类,于谦,他可以说相声。
Yuqian.java
public class Yuqian implements Deyunshe {
@Override
public void Shuoxiangsheng() {
System.out.println("于谦在说相声。。。");
}
}
创建Deyunshe接口的抽象装饰器。
DeyunsheDecorator.java
public abstract class DeyunsheDecoratorimplements Deyunshe {
protected Deyunshe decoratedDYS;
public DeyunsheDecorator(Deyunshedeyunshe){
this.decoratedDYS = deyunshe;
}
public void Shuoxiangsheng(){
decoratedDYS.Shuoxiangsheng();
}
}
扩展了DeyunsheDecorator类的实体装饰类
ThreeHobbiesDecorator.java
public class ThreeHobbiesDecorator extends DeyunsheDecorator { public ThreeHobbiesDecorator(Deyunshe deyunshe) { super(deyunshe); } @Override public void Shuoxiangsheng(){ doHobbies(); decoratedDYS.Shuoxiangsheng(); } private void doHobbies(){ System.out.print("抽烟喝酒烫头的"); } }
测试
public class Test { public static void main(String[] args){ Deyunshe yuqian = new Yuqian(); Deyunshe yuqianWith3Hobbies = new ThreeHobbiesDecorator(new Yuqian()); yuqian.Shuoxiangsheng(); yuqianWith3Hobbies.Shuoxiangsheng(); } }
输出:
于谦在说相声。。。
抽烟喝酒烫头的于谦在说相声。。。
装饰器与适配器的区别
装饰器与适配器模式都属于包装模式(Wrapper),它们看似都是起到包装一个类或对象的作用,但是使用的目的不一样。适配器的目的是将一个接口转变成另一个接口,通过改变接口来达到重复使用的目的。而装饰器相反,装饰器保持原有的接口,通过增强原有对象的功能或提升性能。