草庐IT

c++ - 从文件构建具体对象。有没有适合这个的设计模式?

coder 2024-07-02 原文

我不得不说,我总是尽量保持代码简单美观,主要是尽可能使用设计模式。另外,令我印象深刻的是我在互联网上没有找到与此相关的任何内容(除了简单且非常模糊的示例,主要是在使用 json 的 javascript 中)。

场景是:我必须从一个文件中解析/构建具体对象,该文件的内容可能是 XML、JSON 和/或其他格式。这是一个例子:

具体对象:

// Contains the common states for the entities
struct EntityModel
{
int hp;
int level;
int armor;
int speed;

// Other attributes...
};

class Entity
{
// Stuff (protected/public/private attributes and functions/methods)

private:
EntityModel* m_model; // Pointer to the model used (flyweight)

// Other attributes...
}

文件(在本例中为 XML):

<entity name="Skeleton" class="Undead">
   <attributes>
      <hp value="150" />
      <level value="10" />
      <armor value="75" />
      <speed value="15" />
      <width value="32" />
      <height value="32" />
      <experience value="372" />
      <texture value="skeleton.png" />
      <intelligence value="skeleton.script" />
   </attributes>
   <restistances>
      <resist type="Shock" value="30" />
      <resist type="Fire" value="10" />
   </resistances>
   <attacks>
      <spell name="Blizzard" mp="50" damage="130" distance="0" />
      <spell name="Fireball" mp="30" damage="100" distance="0" />
   </attacks>
   <loot>
      <drop item="Gold Coin" min="30" max="50" probability="1" />
      <drop item="Ruby" min="0" max="2" probability="0.7" />
      <drop item="Enchanted Sword" probability="0.25" />
   </loot>
</entity>

这是实体模型与其文件之间关系的示例。还会有其他对象必须能够从它们的文件中解析/构建/创建。

有些人可能会说在这种情况下设计模式并不是真正必要的,正如我在一些实现中看到的那样,尽管我确实相信有一个。整个实体创建系统涉及抽象工厂、池和享元模式(向工厂请求 createEntity 调用,它将查看是否已创建享元模型并将其缓存在池中或创建并缓存新模型)。

所以,问题是:有什么合适的方法可以做到这一点吗?哪个?

正如我所说的,我将基于这个案例的答案并适应其他对象创建。换句话说,我需要一个通用的答案。

如果这篇文章缺少一些信息,或者在错误的部分,请原谅我,因为这是我在这里的第一篇文章。

提前致谢。

最佳答案

试试 Boost Serialization Library .它有 xml、二进制和文本保存格式。它不太复杂并且有很好的文档。

关于c++ - 从文件构建具体对象。有没有适合这个的设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33137951/

有关c++ - 从文件构建具体对象。有没有适合这个的设计模式?的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  6. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  7. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  8. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  9. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  10. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

随机推荐