Springboot结合@Autowired的策略模式可以参考本人上篇文章:
但是其中有个弊端
调用者需要知道具体的调用者的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层,屏蔽掉了策略的具体实现,做了解耦。
但是当策略方法越来越多时,需要的实体对象就越来越多,反而会影响项目的结构,这点需要注意。