设计模式之——装饰者模式

前言

装饰者模式是一种巧妙的类设计结构,可以便捷的实现对指定类功能的加强,本文将对装饰者模式的应用场景和实现进行讲解,希望能够让对该模式不清楚的读者一些参考。

现在有接口和实现类如下:

// 接口Animal
public interface Animal {
    void eat();
}
// 实现子类Dog
public class Dog implements Animal {

    @Override
    public void eat() {
        System.out.println("汪汪汪...");
    }
}

我们现在想实现Dog类在吃完东西前先做一下检查食物是否足够,吃完东西后输出已经吃完的反馈。这种需求可以怎么实现呢?
我们自然而然地会想到,这很简单,我们在实现类中补上对应的代码不就行了

public class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("检查食物是否满足...");
        System.out.println("汪汪汪...");
        System.out.println("已经吃完啦...");
    }
}

这当然是一种较为简单直接的实现方式,但如果Dog类是前人已经开发并封装好的class类,我们无法直接获取源代码进行修改,这个时候我们可以怎么实现eat方法的增强呢?
实现的方式有很多种,比如应用装饰者模式。装饰可以理解为对某个功能进行增强,让它实现原先没有的功能。这里的话,被装饰者(也就是要增强的对象)自然就是Dog类,装饰者的代码如下:

public class DecorationDog implements Animal {

    private Animal animal;

    public DecorationDog(Animal animal){
        this.animal=animal;
    }

    @Override
    public void eat() {
        System.out.println("检查食物是否满足...");
        animal.eat();
        System.out.println("已经吃完啦...");
    }
}



可以看到,装饰者和被装饰对象实现了同一个接口,且内部定义了一个Animal属性的成员变量,对eat方法的调用,本质上调用的还是传入对象的eat方法。也就是说,我们把需要增强的类对象Dog传入了装饰者对象中,保持原对象方法不变的前提下,让装饰者来实现需要增强的功能,从而得到了最终的增强对象。

小结:

装饰者模式存在着以下特点:
1、可以在不改变被增强类源码的前提下,实现源代码特定功能的增强,增强的功能代码由装饰者负责提供
2、装饰者对象使用的前提是被装饰对象(也就是案例中的Dog类)存在接口
3、装饰者模式有一定的弊端,当实现的接口中有上百个的时候,哪怕我们只是需要增强其中的某个功能,我们也不得不空实现其中的方法。

posted @ 2021-01-17 14:23  moutory  阅读(7)  评论(0编辑  收藏  举报  来源