这次来看下装饰者模式,如有不对请提出,共同提高,谢谢!!!
先看下类图:
直接看代码吧:
/**
* @Author:shenqi
* @Description: DOTA2英雄
* @Date:2019/3/30 23:50
*/
public interface Dota2Hero {
void getSkills();
}
/**
* @Author:shenqi
* @Description: 剑圣
* @Date:2019/3/30 23:51
*/
public class Jugg implements Dota2Hero {
@Override
public void getSkills() {
System.out.println("啥技能都没有");
}
}
/**
* @Author:shenqi
* @Description:
* @Date:2019/3/30 23:53
*/
public abstract class Skills implements Dota2Hero {
public Dota2Hero dota2Hero;
public Skills(Dota2Hero dota2Hero) {
this.dota2Hero = dota2Hero;
}
public abstract void getSkills();
}
/**
* @Author:shenqi
* @Description:
* @Date:2019/3/31 00:01
*/
public class 剑刃风暴 extends Skills {
public 剑刃风暴(Dota2Hero dota2Hero) {
super(dota2Hero);
}
@Override
public void getSkills() {
System.out.println("学习了剑刃风暴");
}
}
/**
* @Author:shenqi
* @Description:
* @Date:2019/3/31 00:14
*/
public class 剑舞 extends Skills {
public 剑舞(Dota2Hero dota2Hero) {
super(dota2Hero);
}
@Override
public void getSkills() {
System.out.println("学习了剑舞");
}
}
/**
* @Author:shenqi
* @Description:
* @Date:2019/3/31 00:15
*/
public class 无敌斩 extends Skills {
public 无敌斩(Dota2Hero dota2Hero) {
super(dota2Hero);
}
@Override
public void getSkills() {
System.out.println("学习了无敌斩");
}
}
/**
* @Author:shenqi
* @Description:
* @Date:2019/3/31 00:14
*/
public class 治疗守卫 extends Skills {
public 治疗守卫(Dota2Hero dota2Hero) {
super(dota2Hero);
}
@Override
public void getSkills() {
System.out.println("学习了治疗守卫");
}
}
public class JuggMain {
public static void main(String[] args) {
Dota2Hero jugg = new Jugg();
jugg.getSkills();
Skills first = new 剑刃风暴(jugg);
first.getSkills();
Skills second = new 剑舞(first);
second.getSkills();
Skills third = new 治疗守卫(second);
third.getSkills();
Skills last = new 无敌斩(third);
last.getSkills();
}
}
说明:
1.符合开放关闭原则,对扩展开放,对修改关闭
2.能够灵活增加需要扩展的类
3.问题是需要创建的类是在太多了,和工厂可以结合使用。