重学 Java 设计模式:实战装饰器模式
====================
在日常的软件开发中,我们不可避免地需要对系统进行功能扩展。这时候,装饰器模式就可以派上用场了。本篇文章将介绍 Java 设计模式中的装饰器模式,并通过一个实际的场景——扩展 SSO 单点登录功能,来展示如何使用装饰器模式实现功能的扩展。
什么是装饰器模式?
装饰器模式是一种常用的设计模式,它允许我们动态地给对象添加新的行为,而无需修改已有的代码。这种模式下,通常会有一个抽象化的接口,定义了原始对象需要实现的方法,而具体的装饰器则会继承这个接口,并在原始对象的基础上添加新的行为。
SSO 单点登录功能介绍
在实际的软件开发中,单点登录功能十分重要。SSO 单点登录指的是,用户只需要登录一次,就可以访问多个不同的应用程序。当用户访问其他程序时,这些程序会自动判断用户权限,而无需重新登录。
在 SSO 单点登录中,登录状态的维护非常关键。通常情况下,会使用一个 cookie 或者 token 来保存登录信息,以便可以在后续访问中使用这些信息来访问其他程序。
SSO 单点登录功能的扩展需求
在实际的开发中,可能会遇到这样的需求:需要限制某些用户在访问某些方法时的权限。这就需要在 SSO 单点登录的基础上,进一步对用户进行权限认证。
比如,假设我们现在有两个系统 A 和 B,它们都实现了 SSO 单点登录。系统 A 中拥有一个方法:方法A()
,只允许管理员访问。我们需要限制用户在未经授权的情况下,无法访问该方法。
如何实现这个需求呢?一种常见的做法是,继承并修改系统 A 的源代码以限制非管理员的访问。但这样做会增加代码的复杂度,并且可能会破坏源代码的封装性和可维护性。那么该怎么办呢?这时候,装饰器模式就可以帮助我们解决这个问题。
装饰器模式在 SSO 单点登录中的应用
对于 SSO 单点登录中的权限控制需求,可以使用装饰器模式来进行扩展。
首先,需要先定义一个 SSODecorator 接口,作为装饰器的抽象类(或接口)。这个接口需要实现 SSO 接口,并且增加一个限制方法的抽象方法。
代码语言:java复制// 定义装饰器接口,需要继承自SSO接口,并定义限制方法的接口
public interface SSODecorator extends SSO {
boolean limitMethod();
}
然后,我们需要创建一个具体的装饰器类SSODecoratorImpl
,并实现这个接口,代码如下所示:
// 创建具体的装饰器类,实现SSODecorator接口
public class SSODecoratorImpl implements SSODecorator{
private SSO sso;
public SSODecoratorImpl(SSO sso){
this.sso = sso;
}
@Override
public boolean limitMethod() { // 实现限制方法
User user = sso.getUser();//获取用户信息
if("admin".equals(user.getType())){//如果是管理员,返回true
System.out.println(user.getUserId() " is admin");
return true;
}else{//否则返回false
System.out.println(user.getUserId() " is not admin");
return false;
}
}
@Override
public boolean verify(String token) {//实现原有的SSO接口
return sso.verify(token);
}
}
在这个具体的装饰器类中,需要将 SSO 接口作为成员变量,并在类构造函数中传入。在限制方法中,可以根据传入的 SSO 的具体实现,获取用户信息,并判断用户类型,从而实现权限的限制。
然后,在系统中,需要使用这个具体的装饰器类对 SSO 接口进行装饰,以添加新的行为。在这个例子中,我们需要对系统 A 中的方法方法A()
进行限制,代码如下所示:
// 记录当前验证器
SSODecorator ssoDecorator = new SSODecoratorImpl(sso);
//校验token
if (ssoDecorator.verify(token)) {
//限制非管理员用户访问方法A
if (ssoDecorator.limitMethod()) {
System.out.println("执行方法A");
} else {
System.out.println("没有权限执行方法A");
}
} else {
System.out.println("token 验证失败");
}
这段代码中,首先需要使用具体的装饰器类来装饰 SSO 接口。然后在校验 token 通过之后,可以使用装饰器对象的limitMethod()
方法来判断当前用户是否有权限访问方法 A。
总结
--
装饰器模式是一种十分常用的设计模式,可以动态地给对象添加新的行为,而无需修改已有的代码。在 SSO 单点登录的场景中,装饰器模式可以帮助我们在原有系统的基础上,添加新的行为和扩展。使用装饰器模式,可以提高系统的可维护性和可扩展性,也可以避免因为直接修改源代码而对系统带来的负面影响。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!