不懂技术与产品怎样做网站,wordpress看板娘插件,seo的作用是什么,多多进宝怎么推广赚钱装饰模式
为了不改变组件的结构#xff0c;动态地扩展其功能。
通常#xff0c;扩展功能通过子类进行#xff0c;但是继承的方式具有静态特征#xff0c;耦合度高。
意图#xff1a;动态地给对象添加额外的功能
主要解决#xff1a;继承方式是静态特征#xff0c;扩…装饰模式
为了不改变组件的结构动态地扩展其功能。
通常扩展功能通过子类进行但是继承的方式具有静态特征耦合度高。
意图动态地给对象添加额外的功能
主要解决继承方式是静态特征扩展的功能多的时候子类会太膨胀
何时使用不想增加很多子类的时候扩展类
1 假设情景
一个宝可梦可以睡觉吃饭放技能如果要扩展它的行为比如Mega进化后假设有专属的Mega技能然后极巨化可以放极巨技能。 宝可梦接口抽象组件Component
public interface Pokemon {void sleep();void eat();void spell();
}**宝可梦实现类**具体组件Concrete Component
有皮卡丘和菊草叶两种实现类作为具体的组件
public class Pikachu implements Pokemon{Overridepublic void sleep() {System.out.println(Pikachu is sleeping...);}Overridepublic void eat() {System.out.println(Pikachu is eating...);}Overridepublic void spell() {System.out.println(Pikachu is spelling...);}
}public class Chikorita implements Pokemon{Overridepublic void sleep() {System.out.println(Chikorita is sleeping...);}Overridepublic void eat() {System.out.println(Chikorita is eating...);}Overridepublic void spell() {System.out.println(Chikorita is spelling...);}
}**宝可梦变化装饰器**抽象装饰Decorator
用抽象类方便扩展多种装饰以应对宝可梦可能有的多种变化
abstract class PokemonDecorator implements Pokemon{Pokemon pokemon;public PokemonDecorator(Pokemon pokemon) {this.pokemon pokemon;}Overridepublic void sleep() {pokemon.sleep();}Overridepublic void eat() {pokemon.eat();}Overridepublic void spell() {pokemon.spell();}
}**宝可梦具体变化**具体装饰Concrete Decorator
实现了Mega进化和极巨化两种变化
public class MegaPokemon extends PokemonDecorator{public MegaPokemon(Pokemon pokemon) {super(pokemon);}public void megaSpell(){super.spell();System.out.println(Mega Power!);}
}public class DymaxPokemon extends PokemonDecorator{public DymaxPokemon(Pokemon pokemon) {super(pokemon);}public void dymaxSpell(){super.spell();System.out.println(Dymax Power!);}
}测试类
public class DecoratorDemo {public static void main(String[] args) {Pokemon chikorita new Chikorita();Pikachu pikachu new Pikachu();DymaxPokemon dymaxPikachu new DymaxPokemon(pikachu);MegaPokemon megaPikachu new MegaPokemon(pikachu);MegaPokemon megaChikorita new MegaPokemon(chikorita);pikachu.spell();dymaxPikachu.dymaxSpell();megaPikachu.megaSpell();megaChikorita.megaSpell();}
}Pikachu is spelling...
Pikachu is spelling...
Dymax Power!
Pikachu is spelling...
Mega Power!
Chikorita is spelling...
Mega Power!至此再回头看是否实现我们的意图动态地给一个对象添加一些额外的职责。
2 吐槽
本来宝可梦只有吃饭睡觉放技能但是随着版本更迭宝可梦还增加了Mega进化极巨化在不用子类扩展的情况下可以使用装饰模式当需要扩展新功能的时候比如在朱紫版本增加了太晶化我们只需要新写一个PokemonDecorator的子类CrystalPokemon实现新功能不还是用子类扩展了吗。。。所以装饰模式的缺点就是装饰类太多的时候比较复杂。。。