装饰器模式
1.什么是装饰器模式
WIKI: 允许将行为静态或动态地添加到单个对象中,而不会影响同一类中其他对象的行为。
2.实例
以前用的QQ秀,需要为角色穿不同的衣服(头饰、脸饰、上衣、裤子。。。),不同的衣服展示不同的形象,而且还可以
根据形象的炫酷值和好友PK。
3.程序示例
/**
* QQ秀角色
*/
public interface QQCharacter {
/**
* 展示
*/
void show();
/**
* 获取炫酷值
*/
int getCoolNum();
}
public class DefaultQQCharacter implements QQCharacter{
@Override
public void show() {
System.out.println("默认服装");
}
@Override
public int getCoolNum() {
return 10;
}
}
/**
* 带上炫酷墨镜(装饰者)
*/
public class WearCoolGlasses implements QQCharacter{
private QQCharacter character;
public WearCoolGlasses(QQCharacter character) {
this.character = character;
}
@Override
public void show() {
character.show();
System.out.println("带上炫酷墨镜-^-^");
}
@Override
public int getCoolNum() {
return character.getCoolNum() + 20;
}
}
@Test
public void test(){
QQCharacter defaultQQCharacter = new DefaultQQCharacter();
System.out.println("-----默认角色-----");
defaultQQCharacter.show();
System.out.println(defaultQQCharacter.getCoolNum());
QQCharacter character = new WearCoolGlasses(defaultQQCharacter);
System.out.println("-----装饰后的角色-----");
character.show();
System.out.println(character.getCoolNum());
System.out.println("-----装饰后的默认角色-----");
defaultQQCharacter.show();
System.out.println(defaultQQCharacter.getCoolNum());
}
-----默认角色-----
默认服装
10
-----装饰后的角色-----
默认服装
带上炫酷墨镜--
30
-----装饰后的默认角色-----
默认服装
10
4.注意
这里不要和适配器(Adapter)模式混淆,装饰器是在原来的基础上添加行为
而并没有改变原来类的行为
5.总结
当要添加额外的行为且不改变原来对象的行为或者当要实现一个功能时要处理各种组合而产生较多子类时[1],使用该模式是最佳实践。
[1]:如上面QQ秀的例子,有不同的眼镜和衣服就会产生不同的组合,当为了特定的组合而去创建类时就会使应用中存在较多的子类。