装饰模式(Decorator Pattern)
:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
可以这么理解:人靠衣装马靠鞍,装饰模式就是给马装鞍,扩展功能。
装饰模式 4 种角色:
Component(抽象构件)
:定义一个抽象接口,以规范接收附加责任的对象。
Concrete Component(具体构件)
:实现Component(抽象构件)
,通过Concrete Decorator(具体装饰器)
为其添加职责。
Decorator(抽象装饰器)
:持有一个 Component(抽象构件)
对象的实例,并实现一个与Component(抽象构件)
接口一致的接口。
Concrete Decorator(具体装饰器)
:负责给Concrete Component(具体构件)
添加上附加的责任。
示例:以孙悟空成长为例:从石猴
一路技能装饰升级,成为齐天大圣
:
// Component(抽象构件): 猴子
public interface Monkey{
// 展示技能
void showSkill();
}
//Concrete Component(具体构件): 孙悟空
public class SunWuKong implements Monkey{
@Override
public void showSkill(){
System.out.println("沐猴而冠");
}
}
// 抽象装饰器(Decorator):技能
public abstract class Skill implements Monkey{
protected Monkey monkey;
public Skill(Monkey monkey){
this.monkey = monkey;
}
@Override
public void showSkill(){
monkey.showSkill();
}
}
//具体装饰器(Concrete Decorator):腾云驾雾
public class FlyingDecorator extends Skill{
public FlyingDecorator(Monkey monkey){
super(monkey);
}
@Override
public void showSkill(){
super.showSkill();
fly();
}
private void fly(){
System.out.println("腾云驾雾!");
}
}
//具体装饰器(Concrete Decorator):耍大棒
public class PlayStickDecorator extends Skill{
public PlayStickDecorator(Monkey monkey){
super(monkey);
}
@Override
public void showSkill(){
super.showSkill();
playStick();
}
private void playStick(){
System.out.println("耍大棒!");
}
}
// 测试
public class Test {
public static void main(String[] args) {
System.out.println("刚从石头蹦出来时所具有技能:");
Monkey monkey = new SunWuKong();
monkey.showSkill();
System.out.println("\n\r获得筋斗云后所具有技能:");
monkey = new FlyingDecorator(monkey);
monkey.showSkill();
System.out.println("\n\r获得金箍棒后所具有技能:");
monkey = new PlayStickDecorator(monkey);
monkey.showSkill();
}
}
输出结果如下:
刚从石头蹦出来时所具有技能:
沐猴而冠
获得筋斗云后所具有技能:
沐猴而冠
腾云驾雾!
获得金箍棒后所具有技能:
沐猴而冠
腾云驾雾!
耍大棒!