在我的应用程序中,我目前有一个URL模型类和一个URLQuery类。
我的URL类有一些属性和一个save方法,它使用注入的数据库类将对象及其属性保存到数据库。
我的URLQuery类有一个方法,用于接收某些条件并从数据库返回行,并将它们从URL类实例化为URL对象。
最近,我开始觉得我的代码可能混合了不同的设计模式。例如,URL模型类需要注入其中的数据库类,并且实例化URL类并在另一个类中设置它的依赖关系会感觉很麻烦,这可能与爬网等有关。
因此,当我研究使用具有数据库依赖性的工厂类并将其注入其他类时。它可能有以下方法:
这有意义吗? 我的URLQuery是否有意义,或者我错过了 - 使用其他设计模式? 我很困惑,正如我在很多教程中看到的那样,直接在模型类中使用save方法等。
答案 0 :(得分:0)
让我们从我们拥有的东西开始。第一个URL是一个模型类,看起来像URLQuery是一个处理程序/控制器类。你有一个需要CRUD操作的数据库,它可以进入控制器类本身,比如DB。
现在让我们尝试分离出功能。通过这种方式,我的意思是模型不应该关心它的数据来自何处。类似地,Model和控制器需要知道db的设置方式和/或db是否是关系的。将控制器仅视为逻辑流处理程序。 DBWrapper不需要知道它保存哪个类的对象,控制器只应告诉它以Y格式保存X数据以保存在Z表中。
那么,我将如何做到这一点
class URL
{
// Variables/methods go here
String Serialize()
{
// This is the data that gets saved to DB. You could return Object, to hide the type
}
static URL Deserialize(String serializedURLModel)
{
Object xyz = /* extract data from serializedURLModel here*/;
return new URL(xyz);
}
}
然后Controller类获得控制权,并驱动逻辑...
public class URLQuery
{
DB db;
public void createURL(URL url)
{
if(!db.HasTable(URLTable))
db.createTable(URLTable); //Assume that you are creating columns and their types here.
db.put(URLTable, url.GetID(), url.Serialize());
}
public void getURL(String urlID)
{
return URL.Deserialize(db.getObjectforColumn(URLTable, urlID));
}
}
最后,我将有一个类DBWrapper并让它返回DB,这是一个接口。因此,在DBWrapper类之外,控制器不知道它是哪个db以及它是如何实现的。如下所示:
interface DB
{
void createTable(String Tablename, ... etc);
void GetObjectForColums(String tableName, String column);
}
public class DBWrapper
{
public static getDB()
{
return new MySQL_DB();
}
private class MySQL_DB implements DB
{
void createTable(String Tablename, ... etc) // implement it here
void GetObjectForColums(String tableName, String column) //implementation
}
}
希望它有用:)
答案 1 :(得分:0)
我理解你的困境。当我们开始学习设计模式时,我们开始认为应该/必须始终使用它们并忘记我们试图解决的问题。在识别问题之前识别设计模式本身就是一个问题。
您的方案实际上很简单,因此也要保持代码简单。 KISS
您只需要一个模型/实体URL,一个用于保存/读取数据库的类,然后只需要一个只需要URL的爬虫,
public class URL {
// only properties
}
// You inject this repository whenever you want to work with db
public class URLRepository {
// This will talk to db
public URL Get(<param>) { } // fetch from db
public int Save(<param>) { } // save to db, and return it's ID
// .. and so on
}
public class Crawler {
// This is just concerned about URL objects
// nothing else
}