深入浅出装饰者模式

举报
海风极客 发表于 2022/10/16 19:03:57 2022/10/16
【摘要】 1 简单介绍装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。四个重要角色:抽象组件Component:一个接口或者抽象类,是定义我们最核心的对象(最原始的对象),被装饰类的抽象。具...

1 简单介绍

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

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

四个重要角色

  • 抽象组件Component:一个接口或者抽象类,是定义我们最核心的对象(最原始的对象),被装饰类的抽象。

  • 具体组件ConcreteComponent:最核心、最原始、最基本的接口或抽象类Component的实现,可以单独用,也可将其进行装饰,比如上面的简单肉夹馍。

  • 抽象装饰者Decorator:一般是一个抽象类,继承或实现Component,在它的属性里面有一个变量为Component抽象构件,是装饰器最关键的地方。

  • 具体装饰者ConcreteDecorator:可以把基础构件装饰成新的东西。

2 场景分析

人类为被装饰者的抽象,学生为装饰者模式中的被装饰的具体角色,衣服的抽象为抽象的装饰类,学生可以被具体的装饰者进行装饰,会增加相应的衣服和体重。

类图:
在这里插入图片描述

3 代码实现

People.java

/**
 * @desc: 抽象组件(被装饰)
 * @author: YanMingXin
 * @create: 2021/10/8-11:55
 **/
public abstract class People {

    /**
     * 返回穿的全部衣服
     *
     * @return
     */
    public abstract String display();

    /**
     * 返回最终的体重
     *
     * @return
     */
    public abstract int getWeight();

}

Clothes.java

/**
 * @desc: 抽象修饰
 * @author: YanMingXin
 * @create: 2021/10/8-11:59
 **/
public class Clothes extends People {

    private People people;

    public Clothes(People people) {
        this.people = people;
    }

    @Override
    public String display() {
        return people.display();
    }

    @Override
    public int getWeight() {
        return people.getWeight();
    }
}

Student.java

/**
 * @desc: 具体组件
 * @author: YanMingXin
 * @create: 2021/10/8-12:01
 **/
public class Student extends People {

    @Override
    public String display() {
       return "学生";
    }

    @Override
    public int getWeight() {
        return 50;
    }
}

Skirt.java

/**
 * @desc: 具体修饰
 * @author: YanMingXin
 * @create: 2021/10/8-13:35
 **/
public class Skirt extends Clothes{

    public Skirt(People people) {
        super(people);
    }

    @Override
    public int getWeight() {
        return super.getWeight()+1;
    }

    @Override
    public String display() {
        return super.display()+" 穿Skirt ";
    }
}

TShirt.java

/**
 * @desc: 具体修饰
 * @author: YanMingXin
 * @create: 2021/10/8-12:02
 **/
public class TShirt extends Clothes {

    public TShirt(People people) {
        super(people);
    }

    @Override
    public int getWeight() {
        return super.getWeight() + 2;
    }

    @Override
    public String display() {
        return super.display() + " 穿T-Shirt ";
    }
}

测试函数

public static void main(String[] args) {
    People student = new Student();
    student = new TShirt(student);
    student = new Skirt(student);
    System.out.println(student.display());
    System.out.println("最终体重:" + student.getWeight());
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ohdvyezR-1633771542685)(深入浅出装饰者模式.assets/image-20211008154402401.png)]

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。