装饰者模式:
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更灵活(其实它也是子类,不过能动态改变它的核心功能)。
UML图展示
上述模型也可以没有Component接口,然后装饰类直接继承要修饰的对象。
// Java 代码示例 没有抽象类
public class MySelf{
private String name;
public MySelf(){}
public MySelf(String name){
this.name = name;
}
// 展示自己形象的方法
public void show(){
System.out.print(name+":");
}
public static void main(String[] args) {
MySelf m = new MySelf("李煜");
Looks looks = new Looks();
// 装饰样貌过程
looks.decorate(m);
Character character = new Character();
// 装饰性格过程
character.decorate(looks);
character.show();
}
}
class DecoratorMy extends MySelf{
protected MySelf m;
public void decorate(MySelf m){
this.m = m;
}
@Override
public void show(){
if(m!=null){
m.show();
}
}
}
class Looks extends DecoratorMy{
@Override
public void show(){
m.show();
System.out.print("长得超级帅,");
}
}
class Character extends DecoratorMy{
@Override
public void show(){
m.show();
System.out.print("性格超温柔,贴心小喵喵");
}
}
有一种像回调函数的感觉。。。。
总结:
装饰者是为已有功能动态的添加更多功能的一种方式。客户端根据需要来添加新的功能。所以一般最好把类的核心职责和装饰功能区分开,这样可以减少类的复杂度,代码可读性高。