装饰模式
2020-08-09 本文已影响0人
潜心之力
一、模式简介
定义:指在不改变现有对象结构的情况下,动态地给该对象增加功能,达到装饰效果。
场景:当终极类增加功能时不能采用继承方式。当对象的功能要求可以动态地添加,也可以再动态地撤销。
- 角色结构:
- 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
- 具体构件(Concrete Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。
- 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
- 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
二、模式实现
以按键手机装饰后成为智能手机为例子
public interface Phone { -> 抽象构件
void action();
}
public class KeyPhone implements Phone { -> 具体构件
@Override
public void action() {
System.out.println("按键手机可以打电话");
}
}
public abstract class Decorator implements Phone { -> 抽象装饰
private Phone phone;
public Decorator(Phone phone){
this.phone = phone;
}
@Override
public void action() {
this.phone.action();
this.decoration();
}
protected abstract void decoration();
}
public class SmartPhone extends Decorator { -> 具体装饰
public SmartPhone(Phone phone) {
super(phone);
}
@Override
protected void decoration() {
System.out.println("智能手机可以玩游戏");
}
}
装饰前后效果对比
KeyPhone keyPhone = new KeyPhone();
keyPhone.action(); -> 装饰前的功能
SmartPhone smartPhone = new SmartPhone(keyPhone);
smartPhone.action(); -> 装饰后的功能