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()); } 复制代码
网络异常,图片无法展示
|