我混合了不同的设计模式吗?

时间:2017-05-17 11:33:17

标签: oop models

在我的应用程序中,我目前有一个URL模型类和一个URLQuery类。

我的URL类有一些属性和一个save方法,它使用注入的数据库类将对象及其属性保存到数据库。

我的URLQuery类有一个方法,用于接收某些条件并从数据库返回行,并将它们从URL类实例化为URL对象。

最近,我开始觉得我的代码可能混合了不同的设计模式。例如,URL模型类需要注入其中的数据库类,并且实例化URL类并在另一个类中设置它的依赖关系会感觉很麻烦,这可能与爬网等有关。

因此,当我研究使用具有数据库依赖性的工厂类并将其注入其他类时。它可能有以下方法:

  • create - 这将接受参数并在那里实例化一个URL类,然后将其返回。
  • save - 这将获取一个URL对象并将其保存到数据库

这有意义吗? 我的URLQuery是否有意义,或者我错过了 - 使用其他设计模式? 我很困惑,正如我在很多教程中看到的那样,直接在模型类中使用save方法等。

2 个答案:

答案 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
}