我不知道我是否理解正确,但我认为你正在寻找继承,你有一个像 BaseAuth 这样的基类,它将针对每个特定的“Auth”类进行扩展,每个特定的类将实现自己的 @987654323 @.
而且,将数据源连接到login 方法也不是一个好主意。您的Auth 类正在做两件事:连接到数据源和登录用户。
所以你可以有类似这个例子的东西(我用过 Java):
abstract class BaseAuth {
protected DataSource dataSource;
public BaseAuth(DataSource dataSource) {
this.dataSource = dataSource;
}
public void login(LoginDTO dto) {
// this.datasource.connect().login() or whatever
// for testing I've added this line:
System.out.println("DATASOURCE = " + this.dataSource.toString());
}
}
每个特定的类都将实现自己的datasource,并且可以通过login方法访问。
是这样的:
class AuthA extends BaseAuth {
public AuthA() {
super(new DataSourceA());
}
}
现在AuthA 创建了自己的DataSourceA。 B 和C 的方式相同。所以 AuthX 类提供数据源,而基类提供登录逻辑。
而来自BaseAuth的DataSource可以是另一个抽象(接口或抽象类):
interface DataSource { }
其中每个DataSourceX 实现DataSource。
我创建了这个 DataSource 示例覆盖 toString() 来测试示例:
class DataSourceA implements DataSource {
public DataSourceA() {
// here the specific implementation
}
@Override
public String toString() {
return "DataSource A";
}
}
所以现在:
-
BaseAuth 类允许您调用.login() 方法,无论它是从AuthA、AuthB 或AuthC 调用的。登录不重复,此类仅负责登录。
- 创建每个“auth”类时,它还会创建自己的
DataSource。所以每个 auth 只负责创建自己的数据源。
-
.login() 将为特定类调用特定的DataSource。
然后,如果您这样做(从方法中删除 DTO 对象以更好地阅读):
BaseAuth auth = new AuthA();
auth.login();
auth = new AuthB();
auth.login();
auth = new AuthC();
auth.login();
结果将是:
DATASOURCE = DataSource A
DATASOURCE = DataSource B
DATASOURCE = DataSource C
请注意您不必重复代码。您只有一个 login 方法将执行相应的 DataSource。
顺便说一下,我会记住你的另一个原则“Duplication is far cheaper than the wrong abstraction”。如果您不完全确定抽象是否正确......请不要尝试。