设计模式原来这么简单-装饰器模式

装饰器模式

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秀的例子,有不同的眼镜和衣服就会产生不同的组合,当为了特定的组合而去创建类时就会使应用中存在较多的子类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值