前言
装饰模式,是指动态
地给一个对象添加一些额外的职责,就增加功能来说,装饰模式相对于生成子类来说更加灵活。
场景引入
一个人,行为是吃喝睡,现在我们想要让这个人成为超人,也就是具有拯救世界的功能。
抽象装饰器AbstractDecorator
拥有抽象类AbstractPerson
的子类对象,并且可以对AbstractPerson
的子类对象进行修饰。
这样在没有修改person
类具体实现的情况下,修改成了ConcreteSuperPersonDecorator
类
1.抽象类 人
/**
* @author 阳光大男孩!!!
*/
public abstract class AbstractPerson {
/**
* 动作
*/
abstract void action();
}
2.人的具体实现类
/**
* @author 阳光大男孩!!!
*/
public class ConcretePerson extends AbstractPerson{
@Override
void action() {
System.out.println("吃...睡...");
}
}
3.装饰抽象类
/**
* @author 阳光大男孩!!!
*/
abstract class AbstractDecorator extends AbstractPerson {
/**
* 被装饰的对象
*/
protected AbstractPerson abstractPerson;
public void setPerson(AbstractPerson abstractPerson) {
this.abstractPerson = abstractPerson;
}
@Override
void action() {
if(abstractPerson!=null)
{
abstractPerson.action();//实际上执行的是abstractPerson的action()方法
}
}
}
这个抽象类的子类能够对其他类进行装饰
。
4.装饰器抽象类的具体实现类
/**
* @author 阳光大男孩!!!
*/
public class ConcreteSuperPersonDecorator extends AbstractDecorator{
@Override
void action() {
super.action();
System.out.println("拯救世界...");
}
}
5.测试
/**
* @author 阳光大男孩!!!
*/
public class Main {
public static void main(String[] args) {
//普通人吃和睡
ConcretePerson person = new ConcretePerson() ;
person.action();
System.out.println("在不改动普通人类的情况下,增加新的功能:");
ConcreteSuperPersonDecorator csd = new ConcreteSuperPersonDecorator();
csd.setPerson(person);
csd.action();
}
}
运行结果
吃...睡...
在不改动普通人相关类的情况下,增加新的功能:
吃...睡...
拯救世界...
总结
装饰器只需要关心自己的功能,而不需要关心新增加的功能是如何添加到对象链中。