学习设计模式之装饰器模式,但是宝可梦

装饰模式

为了不改变组件的结构,动态地扩展其功能。

通常,扩展功能通过子类进行,但是继承的方式具有静态特征,耦合度高。

意图:动态地给对象添加额外的功能

主要解决:继承方式是静态特征,扩展的功能多的时候,子类会太膨胀

何时使用:不想增加很多子类的时候扩展类

1 假设情景

一个宝可梦,可以睡觉,吃饭,放技能;如果要扩展它的行为,比如Mega进化后,假设有专属的Mega技能,然后极巨化,可以放极巨技能。

宝可梦接口:抽象组件(Component)

java 复制代码
public interface Pokemon {
    void sleep();

    void eat();

    void spell();
}

**宝可梦实现类:**具体组件(Concrete Component)

有皮卡丘和菊草叶两种实现类,作为具体的组件

java 复制代码
public class Pikachu implements Pokemon{
    @Override
    public void sleep() {
        System.out.println("Pikachu is sleeping...");
    }

    @Override
    public void eat() {
        System.out.println("Pikachu is eating...");
    }

    @Override
    public void spell() {
        System.out.println("Pikachu is spelling...");
    }
}

public class Chikorita implements Pokemon{
    @Override
    public void sleep() {
        System.out.println("Chikorita is sleeping...");
    }

    @Override
    public void eat() {
        System.out.println("Chikorita is eating...");
    }

    @Override
    public void spell() {
        System.out.println("Chikorita is spelling...");
    }
}

**宝可梦变化装饰器:**抽象装饰(Decorator)

用抽象类方便扩展多种装饰,以应对宝可梦可能有的多种变化

java 复制代码
abstract class PokemonDecorator implements Pokemon{
    Pokemon pokemon;

    public PokemonDecorator(Pokemon pokemon) {
        this.pokemon = pokemon;
    }

    @Override
    public void sleep() {
        pokemon.sleep();
    }

    @Override
    public void eat() {
        pokemon.eat();
    }

    @Override
    public void spell() {
        pokemon.spell();
    }
}

**宝可梦具体变化:**具体装饰(Concrete Decorator)

实现了Mega进化和极巨化两种变化

java 复制代码
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!");
    }
}

测试类

java 复制代码
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,实现新功能(不还是用子类扩展了吗。。。),所以装饰模式的缺点就是:装饰类太多的时候比较复杂(。。。)

相关推荐
阿星AI工作室19 小时前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦2 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo5 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4965 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃5 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
驴儿响叮当20105 天前
设计模式之状态模式
设计模式·状态模式
电子科技圈5 天前
XMOS推动智能音频等媒体处理技术从嵌入式系统转向全新边缘计算
人工智能·mcu·物联网·设计模式·音视频·边缘计算·iot
徐先生 @_@|||5 天前
安装依赖三方exe/msi的软件设计模式
设计模式
希望_睿智6 天前
实战设计模式之访问者模式
c++·设计模式·架构
茶本无香6 天前
设计模式之十六:状态模式(State Pattern)详解 -优雅地管理对象状态,告别繁琐的条件判断
java·设计模式·状态模式