识别模式

时间:2014-04-09 14:29:25

标签: design-patterns

在我设计Android应用程序的过程中,我创建了一些相关的类。

我确信这种模式/关系很受欢迎,我想更多地了解它,以便正确命名类并了解有关模式的更多信息(以改进设计)

我有一个类 Book ,有一些基本属性: title author synopses

书籍存储在文件中,每本书一个文件,并且有一个类来管理文件操作加载/保存/删除。我把这个类称为 BookManager

MainActivity 有一个 BookManager ,可用于查询可用图书,检索图书,保存修改后的图书等操作。

对象之间这种关系的名称是什么?

2 个答案:

答案 0 :(得分:1)

你的BookManager看起来像Data Mapper,正如Martin Fowler所写,它是:

  

Data Mapper是一个软件层,用于将内存中对象与数据库分开。它的职责是在两者之间传输数据,并将它们彼此隔离。使用Data Mapper,即使存在数据库,内存中的对象也不需要知道;他们不需要SQL接口代码,当然也不了解数据库模式。 (数据库模式总是不知道使用它的对象。)由于它是Mapper(473)的一种形式,因此数据映射器本身甚至不为域层所知。

关于你的 MainActivity ,android中的活动更像是application controllers,而Martin Fowler也将其解释为:

  

处理屏幕导航和应用程序流程的集中点。


<强>更新

关于你的问题

  

我不知道Data Mapper。它与MVC不是很相似吗?   图案?

答案是否定的,Data Mapper与MVC无关。 Data Mapper在技术上是您的SQL所在,它将您的数据检索过程与域逻辑分开,例如,如果您需要在表中插入一行,您将拥有一个名为save或{{1}的方法但是,数据映射器并不关心业务逻辑如何处理,处理或操纵数据,它只需要传递给它的参数并将其插入存储器,同样在良好的设计中,您的数据映射器应该不关心你正在使用什么类型的DBMS,

示例基本代码:

insert

所以你的映射器看起来像:

abstract class DataBase implements SomeStroageInterfaces{
protected $host;
protected $username;
protected $password;
protected $databaseName;
protected $isConnected;
public function __construct($host, $username, $password, $databaseName) {
$this->host = $host;
$this->username = $username;
$this->password = $password;
$this->databaseName = $databaseName;
}

abstract public function connect();
abstract public function createConnectionString();
public function isConnected(){
return $this->isConnected;
}
}
//concrete class example
class MySql extends DataBase{
public function connect($connectionString = NULL) {
if(is_null($connectionString)){
  //create connection string
}else{
//connect using connection string
}
}
public function select() {
//some insert implementation;
}
public function from() {
//some update implementati
}
/*some other implementations and abstract methods implementation too*/

您的数据映射器不知道您使用的是哪个dbms,它只是使用您发送给它的class TestMapper{ private $dbh; public function __construct(DataBase $dbh){ $this->dbh = $dbh; } public function selectTest($arg1){ $dbh->select($arg1)->from('tableName'); } $arg1中选择tableName

但是,您也可以使用任何相关对象来处理您的查询,重点是,您的应用程序的存储交互是通过数据映射器完成的。

注意:我的语法是使用PHP,我写它比java更快。

答案 1 :(得分:0)

我认为Adapter Pattern适用于此:

class Book
{
    public readonly string Title;

    // ctor, serialization, other data...
}

interface IFileSystem
{
    void Save(string filename, object objToSerialize);
}

interface IBookSaver
{
    void SaveBook(Book book);
}

class FileSystemBookSaver : IBookSaver
{
    private readonly IFileSystem adaptee;

    public FileSystemBookRepository(IFileSystem adaptee)
    {
        this.adaptee = adaptee;
    }

    public void SaveBook(Book book)
    {
        adaptee.Save(book.Title, book);
    }
}

FileSystemBookSaver适配器可用于保存书籍(如果需要,可以添加其他操作并更改类名)。