使用多态和@Autowired强化Springboot中的策略模式

本文介绍如何使用SpringBoot和@Autowired注解结合面向对象的多态改进策略模式,通过抽象父类和子类实现,使调用者仅需传递实体对象即可调用策略,降低耦合度,提高代码灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Springboot结合@Autowired的策略模式可以参考本人上篇文章:

基于Springboot注解的策略模式

但是其中有个弊端
在这里插入图片描述
调用者需要知道具体的调用者的service名,否则是没办法使用的,这样是不符合高内聚,低耦合的软件设计规则的,那么需要怎么改进呢?

使用面向对象的多态

假如调用者只需要传递某个父类,被调用者根据子类自动找到策略模式的实现类,那么来看代码结构:
在这里插入图片描述
比上个版本多了三个类,AbstractEntity Hello World
抽象父类,AbstractEntity:

@Getter
public abstract class AbstractEntity {

    private String ql;

    public AbstractEntity(String ql) {
        this.ql = ql;
    }
    
    public abstract String getType();
}

子类Hello:

public class Hello extends AbstractEntity {
    private String type = "helloService";

    public Hello(String ql) {
        super(ql);
    }

    @Override
    public String getType() {
        return this.type;
    }
}

子类World:

public class World extends AbstractEntity {
    private String type = "worldService";

    public World(String ql) {
        super(ql);
    }

    @Override
    public String getType() {
        return this.type;
    }
}

可以看到抽象父类AbstractEntity有一个私有属性,ql,一个全参构造方法,一个抽象方法getType();
两个子类,分别实现getType方法,返回各自对应的策略bean的名字,同时拥有全参构造方法,调用父类的构造方法。

来个测试类:

    @Autowired
    private DataCalcStrategy dataCalcStrategy;
    @Test
    public void contextLoads() {
        AbstractEntity abstractEntity = new Hello("111");
        dataCalcStrategy.calc(abstractEntity);
    }

可以看到结果:
在这里插入图片描述
可以看到,调用者不需要知道具体策略的bean名字,只要传入一个实体对象,从而在Strategy层,屏蔽掉了策略的具体实现,做了解耦。

但是当策略方法越来越多时,需要的实体对象就越来越多,反而会影响项目的结构,这点需要注意。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值