设计模式 - 15)用反射和适配器实现切换不同数据库的区别

1.适配器

graph LR id1(OracleUser)--继承-->id2(SqlUser) id3(MysqlUser)--继承-->id2(SqlUser) id4(Client)--调用-->id5(Adapt) id5(Adapt)--关联-->id2(SqlUser) style id1 fill:#f9f,stroke:#333,stroke-width:4px,fill-opacity:0.5 style id2 fill:#ccf,stroke:#f66,stroke-width:2px,stroke-dasharray: 10,5 style id3 fill:#f9f,stroke:#333,stroke-width:4px,fill-opacity:0.5 style id4 fill:#f9f,stroke:#333,stroke-width:4px,fill-opacity:0.5 style id5 fill:#f9f,stroke:#333,stroke-width:4px,fill-opacity:0.5

客户端调用适配器中的 a 方法,a 方法将调用适配器中 SqlUser 对象的 a 方法

client -> adapt.a => adapt.SqlUser.a
public static User SelectUser(string id)
{
    return this.IUser.SelectUser(id);
}

2.反射

graph LR OracleUser--继承-->SqlUser MysqlUser--继承-->SqlUser Client--调用-->DataAccess DataAccess--关联-->SqlUser

客户端调用适配器中的 a 方法,a 方法根据配置中的数据库类型字符串,
通过反射的方式,实例化对应的数据库的类的对象并返回。

client -> adapt.a => SqlUser。

要求:数据库的类名称按一定的命名规范拼凑。

public static IUser CreateUser()
{
    string className = AssemblyName + ".AbstractFactory." + db + "User";
    return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
}
posted @ 2020-12-27 22:04  鑫茂  阅读(144)  评论(0编辑  收藏  举报