设计模式(装饰者模式)

一、简介

装饰者模式可以动态添加代码功能,利用委托机制,服用各个组件,在运行时可以将这些组件进行叠
加形成一个超级对象,使其拥有所有组件的功能。

二、使用场景及优点

适用于通过单一组件实现复杂功能的场景,需要将功能组件和性能组件分离,彼此互不影响,并在需
要的时候有机的结合起来。装饰者模式可以有效的分离性能组件和功能组件,从而提升模块的可维护
性并增加模块的复用性。

三、常见表现形式

装饰者模式分为装饰者(Decorator)、具体装饰者、组件接口、具体组件四部分,实例如下:
1.组件接口
public interface IUserCreator{
    /*
     * 定义组件统计的接口
     */
    public String createUser();
}

2.具体组件(核心组件)

public class UserBaseInfoCreator implements IUserCreator{

    @Override
    public String createUser()
    {
        StringBuilder info = new StringBuilder("-----User Base Info-----\r\n");
        info.append("name:").append("zhangsan").append("\r\n");
        info.append("sex:").append("male").append("\r\n");
        info.append("age:").append("25").append("\r\n");
        return info.toString();
    }
}
3.装饰者(Decorator)
public abstract class UserCreator implements IUserCreator{
	//component被装饰对象
    IUserCreator component = null;

    public UserCreator(IUserCreator c)
    {
        this.component = c;
    }
}
4.具体装饰者
public class UserLocationCreator extends UserCreator{
	//给被装饰者添加位置信息装饰
    public UserLocationCreator(IUserCreator c)
    {
        super(c);
    }

    @Override
    public String createUser()
    {
        StringBuilder info = new StringBuilder(this.component.createUser());
        info.append("-----User Location Info-----\r\n");
        info.append("location:").append("北京市朝阳区").append("\r\n");
        info.append("location NO.:").append("010").append("\r\n");
        return info.toString();
    }
}

public class UserJobCreator extends UserCreator{
	//给被装饰者添加工作信息装饰
    public UserJobCreator(IUserCreator c)
    {
        super(c);
    }

    @Override
    public String createUser()
    {
        StringBuilder info = new StringBuilder(this.component.createUser());
        info.append("-----User Job Info-----\r\n");
        info.append("job:").append("software developer").append("\r\n");
        info.append("company:").append("TENCENT").append("\r\n");
        info.append("workAge:").append("5").append("\r\n");
        return info.toString();
    }
}

四、测试

通过装饰组件可以轻松的装饰核心组件UserBaseInfo的功能,可以随意调整核心组件的特性。
public class DecoratorTest{

    @Test
    public void decoratorTest(){
        /*
         * 组装用户详细信息
         */
        IUserCreator user = new UserJobCreator(new UserLocationCreator(new UserBaseInfoCreator()));
        System.out.println(user.createUser());
    }
    
    @Test
    public void decoratorJobTest(){
        /*
         * 组装用户基本信息和工作信息
         */
        IUserCreator user = new UserJobCreator(new UserBaseInfoCreator());
        System.out.println(user.createUser());
    }
    
    @Test
    public void decoratorLocTest(){
        /*
         * 组装用户基本信息和位置信息
         */
        IUserCreator user = new UserLocationCreator(new UserBaseInfoCreator());
        System.out.println(user.createUser());
    }
}

五、装饰者模式在JDK中的运用

JDK中很多地方用到装饰者模式,最典型的就是IO流的操作,如下:
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\a.txt")));
//不添加缓冲功能的流对象
//DataOutputStream out = new DataOutputStream(new FileOutputStream("D:\\a.txt"));

以上代码是装饰者模式的典型应用,通过嵌套的方式不断的将对象聚合起来,最终形成一个超级对象,并
使之拥有所有相关对象的功能。其中BufferedOutputStream是性能组件,
DataOutputStream是功能组件,通过装饰者模式很好的将性能组件好功能组件完美分离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值