我正在尝试通过一个灵活的案例来调用子映射器方法 但是在这种情况下,即使扩展了父映射器,我们也不知道将调用哪个方法。 [带有mybatis的Spring Boot框架]
// ParentMapper
public interface ParentMapper
{
// List<Map<String, String> findAll();
}
// Child1Mapper
public interface Child1Mapper extends ParentMapper
{
List<Map<String, String> findAll();
}
// Child2Mapper
public interface Child2Mapper extends ParentMapper{
List<Map<String, String> findAll();
}
@Autowired
Child1Mapper child1Mapper;
@Autowired
Child2Mapper child2Mapper;
// some class file
public ParentMapper getMapper(String param){
switch(param){
case "case1" : child1Mapper;
case "case2" : child2Mapper;
... 10 more..
}
}
public class example{
public void somethid(){
// this logic is in some biz
ParentMapper mapper = getMapper("case1"); // <----`-` we do not know where `findAll method` located is in
mapper.findAll();
}
}
如何调用子映射器方法
答案 0 :(得分:1)
如果您将case1
传递给getMapper(String param)
方法,这在代码中很明显,它将返回return new Child1Mapper()
child1mapper对象,因此,如果您调用findAll()
方法,则child1mapper
类findAll()
方法将被调用
如果通过case2
,则将获得child2mapper
对象(which is like Parentmapper p = new Child2Mapper())
,因此,如果调用findAll()
方法(p.findAll())
child2mapper findAll()
方法将被调用
child1mapper
和child2maper
都是parentmapper
的子类,但是child1mapper
和child2mapper
之间没有关系,因此没有方法冲突的概念
答案 1 :(得分:0)
无论您做什么都绝对可以。
提供 :您指的是实际的实现类,而不是此处的接口
case "case1" : return new Child1Mapper();
case "case2" : return new Child2Mapper();
有趣的是:
您刚刚在这里实现了一种设计模式。
您的getMapper
方法代表Factory Method Pattern
。根据需要,此类方法绝对有效。
有关Factory Method Pattern
的更多信息:https://www.tutorialspoint.com/design_pattern/factory_pattern.htm
答案 2 :(得分:0)
TLDR:您在ParentMapper
public interface ParentMapper
{
List<Map<String, String>> findAll();
}
您需要为所有想要实现ParentMapper
接口的类指定共享方法签名。该接口是实施合同。
这将使Child1Mapper和Child2Mapper有义务提供该签名的实现细节。
public interface ParentMapper
{
List<Map<String, String>> findAll();
}
// Child1Mapper
public class Child1Mapper implements ParentMapper
{
public List<Map<String, String>> findAll() { /* implementation */ }
}
// Child2Mapper
public class Child2Mapper implements ParentMapper{
public List<Map<String, String>> findAll() { /* implementation */ }
}
ParentMapper mapper = getMapper("child1"); mapper.findAll()
将使用Child1Mapper
实例的实现。
考虑到您正在使用Spring,也可以调整工厂方法以返回Spring Bean。例如:(这将取决于您如何连接弹簧豆)
@Bean
Child1MapperBean() { return new Child1Mapper() }
@Bean
Child2MapperBean() { return new Child2Mapper() }
public ParentMapper getMapper(String param){
switch(param){
case "case1" : return Child1MapperBean();
case "case2" : return Child2MapperBean();
}
}
答案 3 :(得分:0)
我刚刚想通了... 如果使用ParentMapper,则ChildMappers具有相同的方法。效果很好。
或者我们可以考虑这样思考。
.Exclude()