装饰者模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有类的一个包装。
这种设计模式创建了一个装饰类,用来包装原有的类,并保证类方法签名完整的前提下,提供了额外的功能。
我们就拿学习技能来说,原本一个IT菜鸟,经过学习掌握了前端的知识,再经过学习掌握了后端基本的开发框架,再经过学习掌握了数据库相关的技术。最终成为大神的修炼过程(装饰过程)
public class DecorateDemo {
public static void main(String[] args) {
rubbish ru = new rubbish();//刚开始是一个小垃圾
OldGog oldGog = new OldGog(ru);//开始学习 装饰
//大神进阶第一步
OldGog oldGog1 = new StudyJAVA(oldGog);
//大神进阶第二步
OldGog oldGog2 = new StudyMYSQL(oldGog1);
//大神进阶第三步
OldGog oldGog3 = new StudyWeb(oldGog2);
//查看学习的成果
oldGog3.study();
}
}
//即把一个菜鸟具有的行为抽离出来
interface IPerson{
void study();//学习
}
//真实对象
class rubbish implements IPerson{
@Override
public void study() {
System.out.println("我要成为一个大神");
}
}
//开时学习成一个大神(包装过程)
class OldGog implements IPerson{
protected IPerson person;
public OldGog(IPerson person) {
this.person = person;
}
@Override
public void study() {
person.study();
}
}
//具体装饰类
class StudyWeb extends OldGog{
public StudyWeb(IPerson person) {
super(person);
}
public void studyWeb() {
System.out.println("今天我学习了web技术");
}
@Override
public void study() {
super.study();
studyWeb();
}
}
class StudyJAVA extends OldGog{
public StudyJAVA(IPerson person) {
super(person);
}
public void studyJava() {
System.out.println("今天我学习了JAVA");
}
@Override
public void study() {
super.study();
studyJava();
}
}
class StudyMYSQL extends OldGog{
public StudyMYSQL(IPerson person) {
super(person);
}
public void studyMysql() {
System.out.println("今天我学习了数据库");
}
@Override
public void study() {
super.study();
studyMysql();
}
}