深入浅出装饰者模式

简介: 深入浅出装饰者模式

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());
}
复制代码


网络异常,图片无法展示
|



相关文章
|
6月前
|
设计模式
深入浅出装饰者模式
深入浅出装饰者模式
30 2
|
6月前
|
Java
深入浅出适配器模式
深入浅出适配器模式
50 0
|
6月前
|
设计模式 Java
【设计模式系列笔记】装饰者模式
装饰者模式是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装类中来为原始对象添加新的行为。这种模式可以动态地将责任附加到对象上,而不影响其它对象。
70 11
|
6月前
|
设计模式 Java
深入浅出工厂模式
深入浅出工厂模式
38 0
|
设计模式 缓存 安全
深入浅出设计模式 - 代理模式
深入浅出设计模式 - 代理模式
11759 4
深入浅出设计模式 - 代理模式
|
设计模式 Java
设计模式笔记 -- 装饰者模式
现在有几种饮品,都是单品咖啡,顾客可以点单品咖啡也可以点单品咖啡加调料。
|
设计模式 开发框架 Java
设计模式简介【Java设计模式】
设计模式简介【Java设计模式】
82 0
|
设计模式 安全 Java
深入浅出设计模式 - 适配器模式
深入浅出设计模式 - 适配器模式
60 0
深入浅出设计模式 - 适配器模式
|
设计模式 缓存 安全
深入浅出设计模式 - 外观模式
深入浅出设计模式 - 外观模式
94 0
深入浅出设计模式 - 外观模式
|
设计模式 Java
【设计模式】我终于读懂了装饰者模式。。。(下)
【设计模式】我终于读懂了装饰者模式。。。(下)
【设计模式】我终于读懂了装饰者模式。。。(下)