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