• ⑨小姐,你化妆了吗(请求与响应的装饰)


    前言

      这篇迟迟未出,希望读者别介意。Servlet & JSP 系列,还剩下不到1/4了。keep on。

      系列出品:http://www.cnblogs.com/Alandre/category/552859.html

    本篇结构

      装饰模式(Decorator)

      小例子

      Servlet API 4个包装类

    引子

      都说,美是天生的,小朽不以为然哦!

        

        小姐,你的化妆粉,掉了!

      化妆(包装,装饰),技术来源生活。下面讲讲怎么个化妆-装饰模式

    装饰模式

      什么叫Decorator Pattern

        给一个类添加一些额外的职责,并且在添加这些额外的职责时不会控制该类的执行逻辑。 即使没有某个对象的源代码,甚至即使这个类申明是final的,Decorator模式允许装饰或者包装(直白的说,修改)这个对象的行为。

      

        

        小姐,化妆后真漂亮!(其实存在贬义),但化妆真能改变对象哦。

      

      (光化妆知道),有什么用呢?

        Decorator 模式 适用于无法使用继承的情况,比如对象是final的,或者你自己不想亲自创建对象,而是想从另一个系统中获取。自然,装饰不是一层哦!(小姐,妆太浓了,也不好!)我们可以对某个对象进行双重装饰。

      

      知道后,咱们也是试试化化妆。(装饰模式案例

    选妃子

      妃子都是中原的。但是有 温柔的 ,有 野蛮的 , 有 粗暴的。(够了够了,小朽都恶心了。)然后应付不同的王子,你该怎么做呢。

      (其实就是 对 妃子功能拓展 )

          

          (各个 化妆齐全,眼都看不见了。啊哈哈)

      五步走:抽象构建  具体实现 装饰角色 具体装饰  测试

      抽象构建

        

    package sedion.jeffli.decorator;
    
    /**
     * 抽象接口
     * @author Jeff Li
     *
     */
    public interface Component {
        public void women();
    }

      具体实现

    package sedion.jeffli.decorator;
    /**
     * 实现,附加功能
     * @author Jeff Li
     *
     */
    public class ComponentIml implements Component {
    
        @Override
        public void women() {
            System.out.println("我是妃子");
        }
    
    }
    View Code

      装饰角色

    package sedion.jeffli.decorator;
    /**
     * 装饰角色,持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口
     * @author Li
     *
     */
    public class Decorator implements Component{
    
        private Component component;
        public Decorator(){}
        
        public Decorator(Component component){
            this.component = component;
        }
        
        @Override
        public void women() {
            component.women();
        }
    
    }

      具体装饰 

    package sedion.jeffli.decorator;
    /**
     * 附加功能 第一种 妃子
     * @author Li
     *
     */
    public class DecoratorIml1 extends Decorator{
        
        public DecoratorIml1(){}
        
        public DecoratorIml1(Component component){
            super(component);
        }
        
        public void women(){
            this.addCharacter();
            super.women();
        }
    
        private void addCharacter() {
            System.out.println("温柔");
        }
    }
    第一种装饰
    package sedion.jeffli.decorator;
    /**
     * 附加功能 第二种 妃子
     * @author Li
     *
     */
    public class DecoratorIml2 extends Decorator{
        
        public DecoratorIml2(){}
        
        public DecoratorIml2(Component component){
            super(component);
        }
        
        public void women(){
            this.addCharacter();
            super.women();
        }
    
        private void addCharacter() {
            System.out.println("善良");
        }
    }
    第二种装饰

      测试

    package sedion.jeffli.decorator;
    
    public class test {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
             Component component = new ComponentIml();
             Decorator decorator = new DecoratorIml1(component);  
             decorator.women();  
             
             decorator  = new DecoratorIml2(component);  
             decorator.women();  
        }
    
    }

    小姐啊(小结)

      用图说话。

              

    Servlet Wrapper 类

      然后,知其原理,那就学习下Servlet API 4个很少用到,功能很强大的:

      ServletRequestWrapper,ServletResponseWrapper,HttpServletRequestWrapper,HttpServletResponseWrapper

      ServletRequestWrapper等使用起来很方便,由于它为调用被装在ServletRequest中的对等方法的每一个方法都提供了默认的实现。通过继承ServletRequestWrapper,只需要覆盖想要修改的方法即可。如果没有ServletRequestWrapper,只好直接实现ServletRequest,并为每个接口每个方法写实现。(例子中也可以看到好处。)

     

      

                装饰ServletRequest

    感谢及资源共享

        感谢读者!很喜欢你们给我的支持。如果支持,点个赞。

        知识来源: http://book.douban.com/doulist/3575997/

  • 相关阅读:
    云时代架构阅读笔记一——架构师必备最全SQL优化方案
    虚拟机VMware安装Ubuntuix
    假期周总结八
    虚拟机VMware安装Kali Linux
    codeforces 401D (数位DP)
    2014 多校联合训练赛6 Fighting the Landlords
    lightoj 1224
    lightoj 1020 (博弈)
    lightoj 1019
    lightoj 1018 (状态压缩DP)
  • 原文地址:https://www.cnblogs.com/Alandre/p/3629899.html
Copyright © 2020-2023  润新知