设计模式-装饰器模式(Decorator Pattern)

599 阅读2分钟

Github 源码地址

23种设计模式总览

创建型模式

结构型模式

行为型模式

定义

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

使用场景

1、扩展一个类的功能。

2、动态增加功能,动态撤销。

就是主要为了方便扩展。

在一个类在扩展功能时,如果通过继承的方式扩展,随着功能增加越来越多时,就会导致子类爆炸。

优缺点

优点: 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点: 多层装饰比较复杂。

示例

1.有一个鸭子,他学会说话

public interface DuckStudy {
    void study();
}
class Duck implements DuckStudy {
    @Override
    public void study() {
        System.out.println("我会嘎嘎嘎啦");
    }
}

2.过了几天又学会了fly的功能,于是你请朋友帮忙添加这个功能,但是你朋友担心直接修改Duck内部会有影响,于是使用了装饰者模式来实现

public abstract class Decorator implements DuckStudy {
    protected DuckStudy duckStudy;

    public Decorator(DuckStudy duckStudy) {
        this.duckStudy = duckStudy;
    }

    @Override
    public void study() {
        duckStudy.study();
    }
}
class DuckDecorator extends Decorator{
    public DuckDecorator(DuckStudy duckStudy) {
        super(duckStudy);
    }

    @Override
    public void study() {
        super.study();
        //我现在又学会了一个功能
        addFly();
    }

    private void addFly() {
        System.out.println("我学会了一个新技能---我会飞啦");
    }
}

3.执行结果

public class TestDemo {
    public static void main(String[] args) {
        Duck duck = new Duck();

        DuckDecorator duckDecorator = new DuckDecorator(duck);
        duckDecorator.study();

    }
}

我会嘎嘎嘎啦
我学会了一个新技能---我会飞啦