Spring设计模式(装饰器模式)

Spring设计模式(装饰器模式)

模式的定义:

装饰者模式定义:

​ 动态地为一个对象添加一些额外的职责,若要扩展一个对象的功能,装饰者提供了比继承更有弹性的替代方案。

模式的结构图 :

在这里插入图片描述

模式包含角色 :

抽象构件类(Component):给出一个抽象的接口,用以规范准备接收附加责任的对象
具体构件类(ConcreteComponent):定义一个具体的准备接受附加责任的类,其必须实现Component接口。
装饰者类(Decorator):持有一个构件(Conponent)对象的实例,并定义一个和抽象构件一致的接口。
具体装饰者类(ConcreteDecoratator):定义给构件对象“贴上”附加责任。

使用场景 :

I/O流,数据源包装 ,Spring 中用到的装饰器模式在类名上有两种表现:一种是类名中含有 Wrapper,另一种是类名中含有Decorator。

模式具体实现 :

一 :基础类
@Data
public class Member {
    private String username;
    private String password;
    private String mid;
    private String info;
}
@Data
@AllArgsConstructor
public class ResultMsg {
    private int code;
    private String msg;
    private Object data;
}
二:抽象构件类
public interface SiginService {

    /**
     * 注册的方法
     * @param username
     * @param password
     * @return
     */
    public ResultMsg regist(String username, String password);
}
三:装饰者类
public class RegistForThirdService implements SiginService {

    private SiginService siginService;

    public RegistForThirdService(SiginService siginService){
        this.siginService = siginService;
    }

    public ResultMsg registForQQ(String openId){
        return siginService.regist(openId,null);
    }

    public ResultMsg regist(String username, String password) {
        return siginService.regist(username,password);
    }
}
四 具体构件类
public class SiginServiceImpl implements SiginService {
    public ResultMsg regist(String username, String password) {
        return new ResultMsg(200,"注册成功",new Member());
    }
}
五:测试类
@Test
public void test(){
    RegistForThirdService siginService = new RegistForThirdService(new SiginServiceImpl());
    siginService.registForQQ("openId");
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot使用装饰器模式,可以通过AOP(面向切面编程)实现。AOP是Spring框架的一个重要组成部分,它可以将横切关注点(如日志、安全性、事务管理等)从业务逻辑分离出来,提高了系统的可维护性和可扩展性。 下面给出一个使用AOP实现装饰器模式的示例: 1.首先定义一个接口和它的实现类: ```java public interface UserService { void addUser(String name); } @Service public class UserServiceImpl implements UserService { @Override public void addUser(String name) { System.out.println("add user: " + name); } } ``` 2.定义一个切面类,实现对UserService进行装饰: ```java @Aspect @Component public class UserServiceDecorator { @Autowired private UserService userService; @Before("execution(* com.example.demo.service.UserService.addUser(..)) && args(name)") public void logBefore(String name) { System.out.println("log before add user: " + name); } @Around("execution(* com.example.demo.service.UserService.addUser(..)) && args(name)") public void addUser(String name, ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("start add user: " + name); joinPoint.proceed(); System.out.println("end add user: " + name); } } ``` 3.在Spring Boot的配置类开启AOP: ```java @Configuration @EnableAspectJAutoProxy public class AopConfig { } ``` 在以上示例,UserServiceDecorator类是一个切面,实现了对UserService的装饰。在切面,使用了@Before和@Around两个注解,分别表示在目标方法执行前和执行后执行切面代码。 @Before注解,通过execution指定了切入点,即对UserService的addUser方法进行拦截。同时,使用args指定了方法参数,这样在拦截时可以获取到参数值。 @Around注解,除了指定切入点和方法参数外,还使用了ProceedingJoinPoint对象来控制目标方法的执行。在方法执行前和执行后,切面代码会分别输出日志信息。 最后,在AopConfig类开启了@EnableAspectJAutoProxy注解,启用了AOP功能。 这样,我们就可以在Spring Boot使用装饰器模式了。通过定义不同的切面类,在不修改原有代码的情况下,实现对业务逻辑的增强。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值