【设计模式】装饰器模式

【设计模式】装饰器模式

  • 1.什么是装饰器模式
  • 2.场景案例
  • 3.场景模拟⼯程

【设计模式】装饰器模式_第1张图片
初看上图感觉装饰器模式有点像俄罗斯套娃,⽽装饰器的核⼼就是再不改原有类的基础上给类新增功能。不改变原有类,可能有的⼩伙伴会想到继承、AOP切⾯,当然这些⽅式都可以实现,但是使⽤装饰器模式会是另外⼀种思路更为灵活,可以避免继承导致的⼦类过多,也可以避免AOP带来的复杂性。

1.什么是装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

2.场景案例

【设计模式】装饰器模式_第2张图片
这里模拟⼀个单点登录功能扩充的场景
⼀般在业务开发的初期,往往内部的ERP使⽤只需要判断账户验证即可,验证通过后即可访问ERP的所有资源。但随着业务的不断发展,团队⾥开始出现专⻔的运营⼈员、营销⼈员、数据⼈员,每个⼈员对于ERP的使⽤需求不同,有些需要创建活动,有些只是查看数据。同时为了保证数据的安全性,不会让每个⽤户都有最⾼的权限。

那么以往使⽤的 SSO 是⼀个组件化通⽤的服务,不能在⾥⾯添加需要的⽤户访问验证功能。这个时候我们就可以使⽤装饰器模式,扩充原有的单点登录服务。但同时也保证原有功能不受破坏,可以继续使⽤。

3.场景模拟⼯程

【设计模式】装饰器模式_第3张图片

  • 这⾥模拟的是spring中的类: HandlerInterceptor ,实现接⼝功能 SsoInterceptor 模拟的单点登录拦截服务。
  • 为了避免引⼊太多spring的内容影响对设计模式的阅读,这⾥使⽤了同名的类和⽅法,尽可能减少外部的依赖。
public interface HandlerInterceptor {
    boolean preHandle(String request, String response, Object handler);
}
public class SsoInterceptor implements HandlerInterceptor{
    @Override
	public boolean preHandle(String request, String response, Object handler) {
        // 模拟获取cookie
        String ticket = request.substring(1, 8);
        // 模拟校验
        return ticket.equals("success");
    }
}
package org.itstack.demo.design.test;

import org.itstack.demo.design.SsoInterceptor;
import org.junit.Test;

public class ApiTest {
    @Test
    public void test_sso() {
        SsoInterceptor ssoInterceptor = new SsoInterceptor();
        String request = "1successhuahua";
        boolean success = ssoInterceptor.preHandle(request, "ewcdqwt40liuiu", "t");
        System.out.println("登录校验:" + request +(success ? " 放行" : " 拦截"));
    }
}

// TODO

你可能感兴趣的:(设计模式,装饰器模式,java)