1 相同点:
1)都不能实例化,就是类不能new一个对象。
2)接口的实现类或抽象类的的子类都只有实现接口或抽象中 的方法才能被实例化
1不同点
1)接口里只有定义,方法体不能在接口里实现 / 抽象类可以有定义与实现,被声明为抽象的方法不能有方法体,没有声明为抽象的方法可以有方法体。
2)接口需要实现(implements),抽象类只能被继承(extends)
3)接口里的方法都是抽象的,抽象类只要有一个抽象类的方法就可以。
4)总的来说,接口被运用于实现比较常用的功能,便于日后维护或者删除方法/ 而抽象类更倾向充当公共类的角色,不适于日对里面代码进行修改。
我们看一个银行借款的领子,中国人民银行管理并监督所有的银行,它制定了一个规范,所有的银行在进行借款时都必须遵守这个规范(基本接口);
Version~0.1.0:
中国人民银行定义了一个操作接口:
- package GoodDesignPattern;
- import java.util.Map;
- public interface BankLoan {
- /**
- * 银行借款操作
- * 每个公司都需要实现该方法,并针对自己公司员工的情况进行特殊操作,
- * 比如判断该员工是否有资格,能借款多少等等
- * @return
- */
- public Map<String, String> loanOperation(String userId);
- }
所有的银行都必须遵守这个接口,进行具体的实现:
- package GoodDesignPattern;
- import java.util.HashMap;
- import java.util.Map;
- public class ABC implements BankLoan {
- public Map<String, String> loanOperation(String userId) {
- //所有银行借款必须的校验
- if(userId==null || userId.isEmpty()){
- System.out.println("userId为空!");
- return null;
- }
- //所有银行借款必须的校验
- if(userId.length()!=32){
- System.out.println("userId格式错误,应该为32位!"+userId);
- return null;
- }
- //所有银行借款必须的校验
- if(!queryUserExist(userId)){
- System.out.println("用户不存在:"+userId);
- return null;
- }
- //所有银行借款必须的校验
- if(!queryUserIllegal(userId)){
- System.out.println("用户没有资格进行借款:"+userId);
- return null;
- }
- //业务逻辑
- Map<String, String> map = getResultMap(userId);
- return map;
- }
- //根据数据库查询是否存在,根据自己公司的用户表查询
- public boolean queryUserExist(String userId){
- return true; //return false;
- }
- //根据数据库查询数据查询判断
- public boolean queryUserIllegal(String userId){
- return true; //return false;
- }
- //根据数据库查询相关信息
- public Map<String, String> getResultMap(String userId){
- Map<String, String> map = new HashMap<String, String>();
- map.put("name", "詹姆斯"); //此处为了方便直接写死
- map.put("amount", "100000"); //应根据userId,在系统进行一系列判断计算,得出能借款金额,此处为了方便直接写死
- map.put("rankLevel", "A"); //应根据userId,在系统进行一系列判断计算,得出用户等级,此处为了方便直接写死
- //.....其它一些列操作
- return map;
- }
- }
- package GoodDesignPattern;
- import java.util.HashMap;
- import java.util.Map;
- public class ICBC implements BankLoan {
- public Map<String, String> loanOperation(String userId) {
- //所有银行借款必须的校验
- if(userId==null || userId.isEmpty()){
- System.out.println("userId为空!");
- return null;
- }
- //所有银行借款必须的校验
- if(userId.length()!=32){
- System.out.println("userId格式错误,应该为32位!"+userId);
- return null;
- }
- //所有银行借款必须的校验
- if(!queryUserExist(userId)){
- System.out.println("用户不存在:"+userId);
- return null;
- }
- //所有银行借款必须的校验
- if(!queryUserIllegal(userId)){
- System.out.println("用户没有资格进行借款:"+userId);
- return null;
- }
- //业务逻辑
- Map<String, String> map = getResultMap(userId);
- return map;
- }
- //根据数据库查询是否存在,根据自己公司的用户表查询
- public boolean queryUserExist(String userId){
- return true; //return false;
- }
- //根据数据库查询数据查询判断
- public boolean queryUserIllegal(String userId){
- return true; //return false;
- }
- //根据数据库查询相关信息
- public Map<String, String> getResultMap(String userId){
- Map<String, String> map = new HashMap<String, String>();
- map.put("amount", "100000"); //应根据userId,在系统进行一系列判断计算,得出能借款金额,此处为了方便直接写死
- map.put("rankLevel", "A"); //应根据userId,在系统进行一系列判断计算,得出用户等级,此处为了方便直接写死
- //.....其它一些列操作
- return map;
- }
- }
Version~0.2.0:
中国人民银行修改自己的规范:
之前的接口不变,新增一个抽象类:
- package GoodDesignPattern;
- import java.util.Map;
- public abstract class CommonOpretion {
- public Map<String, String> loanOperation(String userId) {
- //所有银行借款必须的校验
- if(userId==null || userId.isEmpty()){
- System.out.println("userId为空!");
- return null;
- }
- //所有银行借款必须的校验
- if(userId.length()!=32){
- System.out.println("userId格式错误,应该为32位!"+userId);
- return null;
- }
- //所有银行借款必须的校验
- if(!queryUserExist(userId)){
- System.out.println("用户不存在:"+userId);
- return null;
- }
- //所有银行借款必须的校验
- if(!queryUserIllegal(userId)){
- System.out.println("用户没有资格进行借款:"+userId);
- return null;
- }
- //业务逻辑
- Map<String, String> map = getResultMap(userId);
- return map;
- }
- //根据数据库查询是否存在,根据自己公司的用户表查询
- protected abstract boolean queryUserExist(String userId);
- //根据数据库查询数据查询判断
- protected abstract boolean queryUserIllegal(String userId);
- //根据数据库查询相关信息
- protected abstract Map<String, String> getResultMap(String userId);
- }
- package GoodDesignPattern;
- import java.util.HashMap;
- import java.util.Map;
- public class ABC extends CommonOpretion implements BankLoan {
- //根据数据库查询是否存在,根据自己公司的用户表查询
- public boolean queryUserExist(String userId){
- return true; //return false;
- }
- //根据数据库查询数据查询判断
- public boolean queryUserIllegal(String userId){
- return true; //return false;
- }
- //根据数据库查询相关信息
- public Map<String, String> getResultMap(String userId){
- Map<String, String> map = new HashMap<String, String>();
- map.put("name", "詹姆斯"); //此处为了方便直接写死
- map.put("amount", "100000"); //应根据userId,在系统进行一系列判断计算,得出能借款金额,此处为了方便直接写死
- map.put("rankLevel", "A"); //应根据userId,在系统进行一系列判断计算,得出用户等级,此处为了方便直接写死
- //.....其它一些列操作
- return map;
- }
- }
- package GoodDesignPattern;
- import java.util.HashMap;
- import java.util.Map;
- public class ICBC extends CommonOpretion implements BankLoan {
- //根据数据库查询是否存在,根据自己公司的用户表查询
- public boolean queryUserExist(String userId){
- return true; //return false;
- }
- //根据数据库查询数据查询判断
- public boolean queryUserIllegal(String userId){
- return true; //return false;
- }
- //根据数据库查询相关信息
- public Map<String, String> getResultMap(String userId){
- Map<String, String> map = new HashMap<String, String>();
- map.put("amount", "100000"); //应根据userId,在系统进行一系列判断计算,得出能借款金额,此处为了方便直接写死
- map.put("rankLevel", "A"); //应根据userId,在系统进行一系列判断计算,得出用户等级,此处为了方便直接写死
- //.....其它一些列操作
- return map;
- }
- }
这个时候每个银行又要实现抽象类,又要实现接口,他们感觉很麻烦且没有必要,这个时候中国银行又进行调整:
Version~0.3.0:
顶层接口还是不变,抽象类修改:由抽象类实现接口
- package GoodDesignPattern;
- import java.util.Map;
- public abstract class CommonOpretion implements BankLoan{
- public Map<String, String> loanOperation(String userId) {
- //所有银行借款必须的校验
- if(userId==null || userId.isEmpty()){
- System.out.println("userId为空!");
- return null;
- }
- //所有银行借款必须的校验
- if(userId.length()!=32){
- System.out.println("userId格式错误,应该为32位!"+userId);
- return null;
- }
- //所有银行借款必须的校验
- if(!queryUserExist(userId)){
- System.out.println("用户不存在:"+userId);
- return null;
- }
- //所有银行借款必须的校验
- if(!queryUserIllegal(userId)){
- System.out.println("用户没有资格进行借款:"+userId);
- return null;
- }
- //业务逻辑
- Map<String, String> map = getResultMap(userId);
- return map;
- }
- //根据数据库查询是否存在,根据自己公司的用户表查询
- protected abstract boolean queryUserExist(String userId);
- //根据数据库查询数据查询判断
- protected abstract boolean queryUserIllegal(String userId);
- //根据数据库查询相关信息
- protected abstract Map<String, String> getResultMap(String userId);
- }
- package GoodDesignPattern;
- import java.util.HashMap;
- import java.util.Map;
- public class ABC extends CommonOpretion {
- //根据数据库查询是否存在,根据自己公司的用户表查询
- public boolean queryUserExist(String userId){
- return true; //return false;
- }
- //根据数据库查询数据查询判断
- public boolean queryUserIllegal(String userId){
- return true; //return false;
- }
- //根据数据库查询相关信息
- public Map<String, String> getResultMap(String userId){
- Map<String, String> map = new HashMap<String, String>();
- map.put("name", "詹姆斯"); //此处为了方便直接写死
- map.put("amount", "100000"); //应根据userId,在系统进行一系列判断计算,得出能借款金额,此处为了方便直接写死
- map.put("rankLevel", "A"); //应根据userId,在系统进行一系列判断计算,得出用户等级,此处为了方便直接写死
- //.....其它一些列操作
- return map;
- }
- }