首先提到一个关于简单人事管理系统架构的构思。
前端:
Menu:前台界面显示,用switch根据用户输入调用不同的功能。
InputData:用于处理用户输入的数据(字符串、数字、日期等不同格式处理),处理为想得到的数据形式(在PersonOperate中数据预处理时使用)。
PersonOperate:选择不同的按键可调用的不同的功能(增删改查),由Menu调用,通过调用InputData进行数据预处理,随后进行逻辑处理。
后端:
Person:数据基础类,定义了数据属性和相关属性的读取操作。将每一条数据以该对象进行传输、处理。
IPersonDAO(DataAccessConnection):接口,初始接口,用于抽象系统的基本处理方法(增删改查)。
DataBaseConnection:数据库连接类,固定的数据库连接关闭操作。
IPersonDAOProxy:采用了设计模式里的代理。其并不真正实现业务,但是安排业务,或而言之就是继承IPersonDAO接口,传输Person类数据,然后重写接口中方法,定义初步方法架构。具体就是连接数据库,还有异常捕获抛出等,同时调用具体增删改查方法(写在IPersonImpl类中)。
IPersonImpl:IPersonDAOProxy类中处理方法的具体实现。也可以理解为代理分发任务给该类,该类进行细致处理。
DAOFactory:设计模式中的工厂,程序中出现接口时需要解耦合,即完成“接口实例化”这一过程,该做法的好处具体在下面说明。
接口泛指实体把自己提供给外界的一种抽象化物,用以由内部操作分离出外部「沟通方法」,使其能被内部修改而不影响外界其他实体与其交互的方式。(别人调用采用固定格式,而与自己内部逻辑无关。)
比如,当企业需要把数据库从Oracle迁移到Mysql时,你只需要在配置文件中把Oracle换成MySQL即可。具体来说就是定义一个接口DataBase,之后无论是Oracle还是Mysql都继承这个接口DataBase实现,后续需要改或者切换时只需要实例化相应的实现类即可。
interface DataBase{
void GoDataBase(){}
}
class MysqlService implements DataBase{
void GoDataBase(){}
}
class OracleService implements DataBase{
void GoDataBase(){}
}
class NosqlService implements DataBase{
void GoDataBase(){}
}
class Run{
void Do(DataBase database){
// 传递参数为DataBase对象,所以其子类都可以作为对象传参
// 因为目前我们不知道想做用那个数据库,想用时传递对应数据库即可
GoDataBase(DataBase database); // 可以替换成
}
public static void main(String[] args){
DataBase database;
//
// 想用哪种数据库,new 什么对象
DataBase s1=new MysqlService();
Do(s1)
}
}
这种做法的好处是:如果你直接声明MysqlService类,那如果业务变更所有MysqlService类的相关部分都需要跟着变更,如果删了MysqlService类那整体程序逻辑也会中断。但如果你采用了接口,假如依旧删除MysqlService或者OracleService,对于相关位置方法的调用并没有直接影响,且你也可以随意扩展一个新的类来实现DataBase接口。因为这主要取决于你传的对象是什么类型。