这次来看下装饰者模式,如有不对请提出,共同提高,谢谢!!!
先看下类图:
直接看代码吧:
/** * @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.问题是需要创建的类是在太多了,和工厂可以结合使用。
原文:https://www.cnblogs.com/shenqiaqia/p/10629916.html