初识装饰器模式

前言

这一周开局不是很美好,折腾环境折腾了两天,好在最后都折腾好了,问题的根本不在于电脑,在于穷,自此下定决心,等自己工作挣钱了一定买一台好电脑。
初识装饰器模式_第1张图片
后来就跟着教程继续跟进,感觉除了单元测试,其他的都还好吧,不过每天晚上听潘老师讲解一下单元测试,发现单元测试也不是那么难理解,看到装饰器模式这部分的介绍有点懵了就:

alphago前几年风靡全球,但你一定想不到的是:早上18世纪晚期的1770年,土耳其便已经拥有了一台自动下棋(应该是国际象棋)装置,比2016年3月alphago成名足足早了240年!该下棋装置在当时击败了大多数挑战者,这其中还包括了拿破仑。此装置不止能够计算出下一个落棋点,而且还可以自动拿着棋子下棋,甚至于还会与人交流说"将军"。
重点就在下棋装置里面的"人",实际上在下棋装置中偷偷藏了一个下棋的高手。而下棋装置走的每一步棋,都是由该下棋高手在内容操作的(当然这种操作本身使用机器装置传递到机器臂也很复杂)。

但笔者想说的是:这种在下棋装置中将下棋高手包装(装饰)起来,以使得下棋傀儡拥有下棋高手的下棋能力的模式,被称为"装饰器模式"。

一开始就挺疑惑的,毕竟做出来的东西是人在操控,并且实现的就是人会的下棋功能,这不就是糊弄人吗,做它的意义是什么呢,直接让人下棋不更好吗,通过后来的代码,我才知道,所谓的“下棋傀儡”仅仅拥有下棋高手的功能,只是对下棋高手进行了装饰。

应用场景

token的问题解决后本节展示如何将新令牌添加到请求的header中。

上节中学习过了使用request.getHeader(String key);来获取header中某个key的值。通常来说则还会有个类似的request.setHeader(String key, String value);的方法用于设置header中的某个key的值。

很遗憾,出于某些方面的考虑spring中(确认说是servlet)中并没有提供设置header的方法。

在这一节的功能是设置header中的某个key值。
下面用代码解释一下具体的作用:

class TokenFilterTest 
{
    /**在此传入auth-token的值*/
    @Test
    void doFilter(HttpServletRequest request)
    {
        String authToken = "654321";
        this.getAuthUser(request);
    }
    /** 在此获取auth-token的值 */
    void getAuthUser(HttpServletRequest request
    {
        // 获取auth-token
        request.getHeader("auth-token");
        // 获取当前登录用户header中的auth-token
    }
 }

此处的getHeader()方法为HttpServletRequest内置的方法,用于获取header中的某个key值,假如使用装饰器模式:

class TokenFilterTest {
...
}

/**
 * HttpServletRequest傀儡
 */
 /*继承自HttpServletRequest,那么该傀儡拥有HttpServletRequest 的所有方法*/
class RequestWrapper extends HttpServletRequest 
{
 /*必须装入一个真正的HttpServletRequest */
    HttpServletRequest request; 
   
    private RequestWrapper()
    { 
    }
    /*必须装入一个真正的HttpServletRequest */
    public RequestWrapper(HttpServletRequest request) 
    { 
        this.request = request;
    }

    @Override
    /*拥有HttpServletRequest的getHeader()功能*/
    String getHeader(String key)
    { 
    /*实际完成getHeader()功能的是真正的HttpServletRequest */
        return this.request.getHeader(key); 
    }
}

那么上面的方法就变成了这样:

class TokenFilterTest 
{
    /**在此传入auth-token的值*/
    @Test
    void doFilter(HttpServletRequest request)
    {
        String authToken = "654321";
        RequestWrapper requestWrapper = new RequestWrapper(request);        
        this.getAuthUser(requestWrapper);
     }
    /** 在此获取auth-token的值 */
    void getAuthUser(HttpServletRequest request
    {
        // 获取auth-token
        request.getHeader("auth-token");
        // 获取当前登录用户header中的auth-token
    }
 }
 /**
 * HttpServletRequest傀儡
 */
 /*继承自HttpServletRequest,那么该傀儡拥有HttpServletRequest 的所有方法*/
class RequestWrapper extends HttpServletRequest 
{
 /*必须装入一个真正的HttpServletRequest */
    HttpServletRequest request; 
   
    private RequestWrapper()
    { 
    }
    /*必须装入一个真正的HttpServletRequest */
    public RequestWrapper(HttpServletRequest request) 
    { 
        this.request = request;
    }

    @Override
    /*拥有HttpServletRequest的getHeader()功能*/
    String getHeader(String key)
    { 
    /*实际完成getHeader()功能的是真正的HttpServletRequest */
        return this.request.getHeader(key); 
    }
}

那么这时候我便可以对header中的某个key值进行赋值操作:

/**
 * Request傀儡
 */
class RequestWrapper extends HttpServletRequest {
    ...
    @Override
    String getHeader(String key) {
        if ("auth-token".equals(key)) {
            // 在此返回新的auth-token值
            return "456789";
        }
        return this.request.getHeader(key);
    }
}

要想返回特定的auth—token值,只需用某一变量进行传值即可,这里也就不做详细配置了。

总结

由于刚刚开始这部分的学习,不了解这样做对后面有什么影响,但是值得高兴的是,为以后类似问题的解决提供了新的思想,以后要学的还很多,这也许只是个开始吧。
最后呢,希望疫情早点过去,不希望再有坏消息了。

你可能感兴趣的:(springboot)