zoukankan      html  css  js  c++  java
  • 设计模式(装饰者模式)

    一、简介

    装饰者模式可以动态添加代码功能,利用委托机制,服用各个组件,在运行时可以将这些组件进行叠

    加形成一个超级对象,使其拥有所有组件的功能。

    二、使用场景及优点

    适用于通过单一组件实现复杂功能的场景,需要将功能组件和性能组件分离,彼此互不影响,并在需

    要的时候有机的结合起来。装饰者模式可以有效的分离性能组件和功能组件,从而提升模块的可维护
    性并增加模块的复用性。

    三、常见表现形式

    装饰者模式分为装饰者(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-----
    ");
            info.append("name:").append("zhangsan").append("
    ");
            info.append("sex:").append("male").append("
    ");
            info.append("age:").append("25").append("
    ");
            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-----
    ");
            info.append("location:").append("北京市朝阳区").append("
    ");
            info.append("location NO.:").append("010").append("
    ");
            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-----
    ");
            info.append("job:").append("software developer").append("
    ");
            info.append("company:").append("TENCENT").append("
    ");
            info.append("workAge:").append("5").append("
    ");
            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是功能组件,通过装饰者模式很好的将性能组件好功能组件完美分离。

  • 相关阅读:
    Charles截获iPhone网络请求
    android小Demo--圆球跟随手指轨迹移动
    《腾讯网UED体验设计之旅》读后感
    eatwhatApp开发实战(十四)
    [Unity2d系列教程] 006.Unity如何根据图片自动生成Animator
    [Unity2d系列教程] 005.Unity如何使用外部触控插件FingerGuesture
    eatwhatApp开发实战(十三)
    微服务平台技术架构
    Istio 流量劫持过程
    Istio 组件常用端口
  • 原文地址:https://www.cnblogs.com/pocter/p/3684457.html
Copyright © 2011-2022 走看看