10、装饰者模式
一、装饰者模式定义
装饰者模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象
二、装饰者的应用场景
1、想透明并且动态地给对象增加新的职责的时候
2、给对象增加的职责,在未来存在增加或减少可能。
3、用继承扩展功能不太实现的情况下,应该考虑用组合方式
三、装饰模式的优点
1、装饰者模式与继承关系的目的都是要扩展对象的功能,但是decorator可以提供比继承更多灵活性。
2、通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
四、装饰者模式的缺点
1、这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
2、装饰者模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
五、装饰者模式的实现
package Decorator; /** * Created by Administrator on 2018/3/2 0002. */ public class Decorator extends Hero{ @Override public String getPower() { return super.getPower(); } }
public class Hero { public String power="我是普通英雄"; public String getPower(){ return this.power; } }
public class FamaleHero extends Hero{ FamaleHero(){ this.power+=" 女性"; } }
public class MaleHero extends Hero{ MaleHero(){ this.power+=" 男性"; } }
public class Eat extends Decorator { Hero hero=new Hero(); Eat(Hero hero){ this.hero=hero; } @Override public String getPower() { return hero.getPower()+" 会吃饭"; } }
public class Fight extends Decorator { Hero hero=new Hero(); Fight(Hero hero){ this.hero=hero; } @Override public String getPower() { return hero.getPower()+" 会打斗"; } }
public class Player { public static void main(String[] args) { Hero hero1=new Hero(); System.out.println(hero1.getPower()); MaleHero mh=new MaleHero(); System.out.println(mh.getPower()); Fight fmh=new Fight(mh); System.out.println(fmh.getPower()); Eat efmh=new Eat(fmh); System.out.println(efmh.getPower()); } }
六、装饰者模式和适配器模式的区别