作用:
最大限度的减少代码的侵入性
Step1 : 一个抽象的根类,定义相同作用的类的公共方法
Step2 : 写不同作用的类继承该抽象类,实现方法以及逻辑
Step3 : 写装饰器,同时继承Step1中的抽象类,实现方法,声明一个父类的对象
抽象方法
package com.jianghai.juc.models.decorator;
/**
* 根类抽象类,用以定义方法
*/
public abstract class Competitor {
/**
* @author: jianghai.jin
* @createDate: 2022/3/21 11:08
* @description: 唱歌
*/
public abstract void work() ;
}
不同功能作用的实现类
音乐
package com.jianghai.juc.models.decorator;
/**
* 音乐功能
*/
public class CompetitorDecoratorMusic extends Competitor {
/**
* 音乐
*/
public void work(){
System.out.println("通过修饰-->音乐功能");
}
}
舞蹈
package com.jianghai.juc.models.decorator;
/**
* 跳舞功能
*/
public class CompetitorDecoratorDance extends Competitor {
/**
* 跳舞功能
*/
public void work() {
System.out.println("通过修饰-->舞蹈功能");
}
}
装饰类
package com.jianghai.juc.models.decorator;
/**
* 装饰方法
*/
public class CompetitorDecorator extends Competitor {
/**
* 定义抽象类对象,
* 因为不同的功能作用类继承了该类,所以以多态的方式调用不同功能作用对抽象类方法的实现
*/
private Competitor competitor;
/**
* 构造器传入继承抽象类的功能类
* @param competitor
*/
public CompetitorDecorator(Competitor competitor) {
this.competitor = competitor;
}
/**
* 实际工作方法
*/
@Override
public void work() {
// 先调用装饰方法
prepareWork();
// 再调用实际工作方法
competitor.work();
}
/**
* 装饰方法
*/
public void prepareWork(){
System.out.println("准备场地");
}
}
测试方法
package com.jianghai.juc.models.decorator;
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
// 唱歌
CompetitorDecorator competitorDecoratorA = new CompetitorDecorator(new CompetitorDecoratorMusic());
competitorDecoratorA.work();
System.out.println("-------------------------------------------");
// 舞蹈
CompetitorDecorator competitorDecoratorB = new CompetitorDecorator(new CompetitorDecoratorDance());
competitorDecoratorB.work();
}
}
运行结果