设计模式之——装饰(Decorator)模式
装饰模式定义
指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
装饰模式的优点
- Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
- 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
装饰模式的缺点
- 增加了系统的复杂度。
装饰模式的实现
定义一个抽象角色
/**
* @ClassName AbstractRole
* @Description TODO
* @Author mamingcong
* @Date 2020/6/11 18:06
* @Version 1.0
*/
public interface AbstractRole {
public void getName();
}
定义一个具体角色
/**
* @ClassName RealRole
* @Description TODO
* @Author mamingcong
* @Date 2020/6/11 18:08
* @Version 1.0
*/
public class RealRole implements AbstractRole{
@Override
public void getName() {
System.out.println("我的名字是RealRole");
}
}
定义一个抽象装饰角色
/**
* @ClassName AbstractDecorator
* @Description TODO
* @Author mamingcong
* @Date 2020/6/11 18:10
* @Version 1.0
*/
public class AbstractDecorator implements AbstractRole {
private AbstractRole abstractRole;
public AbstractDecorator(AbstractRole abstractRole) {
this.abstractRole = abstractRole;
}
@Override
public void getName() {
abstractRole.getName();
}
}
定义一个具体装饰角色
/**
* @ClassName RealDecorator
* @Description TODO
* @Author mamingcong
* @Date 2020/6/11 18:11
* @Version 1.0
*/
public class RealDecorator extends AbstractDecorator {
public RealDecorator(AbstractRole abstractRole) {
super(abstractRole);
}
public void setName() {
System.out.println("装饰着增加的名字");
}
public void getName() {
super.getName();
}
}
测试
/**
* @ClassName Test
* @Description TODO
* @Author mamingcong
* @Date 2020/6/11 18:14
* @Version 1.0
*/
public class Test {
public static void main(String[] args) {
AbstractRole abstractRole = new RealRole();
AbstractDecorator abstractDecorator = new RealDecorator(abstractRole);
abstractDecorator.getName();
}
}
运行结果
装饰着增加的名字
我的名字是RealRole
装饰模式的使用场景
- 当需要给一个现有类添加附加职责,但是不能采用继承的方法进行扩充时。
- 当对象的功能要求可以动态地添加,也可以再动态地撤销时。