在我设计Android应用程序的过程中,我创建了一些相关的类。
我确信这种模式/关系很受欢迎,我想更多地了解它,以便正确命名类并了解有关模式的更多信息(以改进设计)
我有一个类 Book ,有一些基本属性: title , author 和 synopses 。
书籍存储在文件中,每本书一个文件,并且有一个类来管理文件操作加载/保存/删除。我把这个类称为 BookManager 。
MainActivity 有一个 BookManager ,可用于查询可用图书,检索图书,保存修改后的图书等操作。
对象之间这种关系的名称是什么?
答案 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
适配器可用于保存书籍(如果需要,可以添加其他操作并更改类名)。