Radio

一个小小程序员

0%

装饰器模式

装饰器模式

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

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

我们通过下面的实例来演示装饰器模式的用法。

示例演示
  1. 我们定义一个生物接口,生物接口中有一个说话的功能。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    package test.decorator;

    /**
    * 所有生物的标识
    */
    public interface Organism {
    //所有生物共有的一个功能,有自己的沟通方式
    void say();
    }
  1. 定义一个人类实体类,让他具有生物的性质。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    package test.decorator;

    public class People implements Organism{

    @Override
    public void say() {
    System.out.println("people say");
    }
    }
  1. 接下来,重点来了,我们要对这个生物的接口进行拓展,但是其是一个原始属性的接口,所以我们定义一个抽象类,来装饰这个接口。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package test.decorator;

    public class OrganismDecorator implements Organism {
    protected Organism organism;

    public OrganismDecorator(Organism organism) {
    this.organism = organism;
    }

    public void say() {
    organism.say();
    }

    }
  2. 现在我们再对这个接口进行实际拓展,比如可以说中文,也可以说英文。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package test.decorator;

    public class ChineseOrganismDecorator extends OrganismDecorator{
    public ChineseOrganismDecorator(Organism organism) {
    super(organism);
    }

    @Override
    public void say(){
    organism.say();
    this.language(organism);
    }

    private void language(Organism organism){
    System.out.println("say Chinese");
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package test.decorator;

    public class EnglishOrganismDecorator extends OrganismDecorator {
    public EnglishOrganismDecorator(Organism organism) {
    super(organism);
    }

    @Override
    public void say() {
    organism.say();
    this.language(organism);
    }

    private void language(Organism organism) {
    System.out.println("say English");
    }
    }
  3. 完成上面的步骤,我们的接口拓展就完成了,这时候我们演示一下这个接口,让某个人同时可以说中文和英文。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package test.decorator;

    public class DecoratorDemo {
    public static void main(String[] args) {
    Organism people = new People();

    OrganismDecorator speak = new OrganismDecorator(people);

    ChineseOrganismDecorator chinese = new ChineseOrganismDecorator(speak);
    EnglishOrganismDecorator english = new EnglishOrganismDecorator(chinese);
    english.say();

    }
    }

    运行结果:

    1
    2
    3
    people say
    say Chinese
    say English
  1. 我们也可以接着创建一个动物,动物也有自己说话的方式。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    package test.decorator;

    public class Animal implements Organism{

    @Override
    public void say() {
    System.out.println("animal say");
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package test.decorator;

    public class AnimalOrganismDecorator extends OrganismDecorator {
    public AnimalOrganismDecorator(Organism organism) {
    super(organism);
    }

    @Override
    public void say() {
    organism.say();
    this.language(organism);
    }

    private void language(Organism organism) {
    System.out.println("say animal");
    }
    }
  2. 实例化动物,让其有Organism的属性,但是有自己独特的说话方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package test.decorator;

    public class DecoratorDemo {
    public static void main(String[] args) {

    Organism animal = new Animal();
    OrganismDecorator animalSpeak = new OrganismDecorator(animal);
    AnimalOrganismDecorator animLan = new AnimalOrganismDecorator(animalSpeak);
    animLan.say();

    }
    }

    运行结果:

    1
    2
    animal say
    say animal
说明

以上就是装饰器模式,这种模式的出现是为了更好的拓展功能,而尽可能的减小原结构的改造,各个类都可以独立发展,互相不耦合;缺点就是随着功能的多样化,子类会变得越来越复杂。

欢迎关注我的其它发布渠道