装饰器模式
定义
向一个对象增加新的功能但又不改变其结构
应用场景
不改变功能结构,来实现功能增强,可以通过子类继承的方式来实现,但是没进行一项功能增加,就要进行一次继承,会造成子类的无序扩张,难以控制,
比如我有台电脑可以玩游戏
后续玩游戏的时候我需要,
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