设计模式——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),它们看似都是起到包装一个类或对象的作用,但是使用的目的不一样。适配器的目的是将一个接口转变成另一个接口,通过改变接口来达到重复使用的目的。而装饰器相反,装饰器保持原有的接口,通过增强原有对象的功能或提升性能。

猜你喜欢

转载自blog.csdn.net/qq407388356/article/details/79743672