装饰器模式

装饰器模式是一种设计模式,用于在不修改对象结构的情况下添加新功能。它通过创建包装类(装饰类)来包裹原对象,实现功能的动态扩展。文章通过电脑玩游戏的例子展示了如何使用装饰器模式添加音乐播放和动画显示功能,强调了该模式能减少子类的无序扩张,提高代码的灵活性,同时指出多层装饰可能带来的复杂性问题。
摘要由CSDN通过智能技术生成

装饰器模式

定义

向一个对象增加新的功能但又不改变其结构

应用场景

不改变功能结构,来实现功能增强,可以通过子类继承的方式来实现,但是没进行一项功能增加,就要进行一次继承,会造成子类的无序扩张,难以控制,
比如我有台电脑可以玩游戏
后续玩游戏的时候我需要,
1.玩游戏的时候需要放音乐
2.玩游戏的时候需要放动画
这个时候就可以用装饰器模式进行增强

优点

可以不破坏原有结构进行功能性增加,而且装饰类和被装饰的类可独立的开发,减少耦合

缺点

一层一层的装是很复杂的,因此要避免多层装饰

实现

接口

电脑玩游戏接口

public interface Computer {

    void playGame();
}

电脑类

windows电脑类

public class Windows implements Computer{

    @Override
    public void playGame() {
        System.out.println("play windows game");
    }
}

Mac电脑类

public class Mac implements Computer {

    @Override
    public void playGame() {
        System.out.println("play mac game");
    }
}

抽象装饰器

public abstract class DecoratorComputerA implements Computer {

    protected Computer computer;

    public DecoratorComputerA(Computer computer) {
        this.computer = computer;
    }

    @Override
    public void playGame() {
        //通用增加
        System.out.println("增加一些通用的方法");
        computer.playGame();
    }

}

动画增强

public class PlayAnimation extends DecoratorComputerA{


    public PlayAnimation(Computer computer) {
        super(computer);
    }

    @Override
    public void playGame() {
        //增加动画播放
        System.out.println("Play Animation");
        super.playGame();
    }
}

音乐增强

public class MusicPlay extends DecoratorComputerA{

    public MusicPlay(Computer computer) {
        super(computer);
    }

    @Override
    public void playGame() {
        //增加放音乐
        System.out.println("play music");
        computer.playGame();
        //
    }

}

测试类

测试方法

public static void main(String[] args) {
        DecoratorComputerA playAnimation = new PlayAnimation(new Windows());
        playAnimation.playGame();
        DecoratorComputerA musicPlay = new MusicPlay(new Mac());
        musicPlay.playGame();
    }

测试结果

Play Animation
增加一些通用的方法
play windows game
play music
play mac game
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值