我们在设计代码,使用接口还是抽象类时。
前提要确定两点:一是需要为哪些类提供接口或抽象,二是这些类的特性有哪些。
共同点封装为抽象类,异同点封装为接口,让各自的类去重写这些差异功能。
抽象类主要用来抽象类别,接口主要用来抽象功能。
1、功能接口(异同点)
public interface Ihandler{
ResponseDto execte1(RequestDto requestDto);
ResponseDto execte2(RequestDto requestDto);
}
2、抽象类并实现功能接口(共同点)
public abstract class Handler implements IHandler{
protected String str;
public string getStr(){
return str;
}
public void setStr(String str){
this.str = str;
}
public ResponseDto execute3(RequestDto requestDto){
ResponseDto responseDto = new ResponseDto;
//具体的功能代码
return responseDto;
}
public ResponseDto execute4(RequestDto requestDto){
ResponseDto responseDto = new ResponseDto;
//具体的功能代码
return responseDto;
}
}
3、继承抽象类的子类A和子类B,实现接口方法,执行不同的继承类方法
@component(value = "AConsts")
public class RealHandler extends Handler{
@Override
public ResponseDto execute1(RequsetDto requestDto){
ResponseDto responseDto = execute3(str,requsetDto);
//具体的功能代码
return responseDto;
}
@Override
public ResponseDto execute2(RequsetDto requestDto){
ResponseDto responseDto = execute4(str,requsetDto);
//具体的功能代码
return responseDto;
}
}
子类B
@component(value = "BConsts")
public class RealHandler extends Handler{
@Override
public ResponseDto execute1(RequsetDto requestDto){
ResponseDto responseDto = execute4(str,requsetDto);
//具体的功能代码
return responseDto;
}
@Override
public ResponseDto execute2(RequsetDto requestDto){
ResponseDto responseDto = execute3(str,requsetDto);
//具体的功能代码
return responseDto;
}
}
4、通过类名获取对应的子类
@Service
public class HandleService{
@Autowired
private Map<String, Handler> handlerMap;
public void execute5(RequestDto requestDto){
//可以重复执行的代码
Handler handler = handlerMap.get("BConsts");
handler.execute1(requestDto);
handler = handlerMap.get("AConsts");
handler.execute2(requestDto);
}
}