跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 享元模式
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
== 代码示例 == 以下示例展示如何用享元模式优化文本编辑器中的字符渲染: <syntaxhighlight lang="cpp"> #include <iostream> #include <unordered_map> #include <string> // 享元接口 class Character { public: virtual void display(int position) = 0; virtual ~Character() = default; }; // 具体享元类 class ConcreteCharacter : public Character { private: char symbol_; // 内在状态(可共享) public: explicit ConcreteCharacter(char symbol) : symbol_(symbol) {} void display(int position) override { // 外在状态由参数传递 std::cout << "Character '" << symbol_ << "' at position " << position << std::endl; } }; // 享元工厂 class CharacterFactory { private: std::unordered_map<char, Character*> characters_; public: Character* getCharacter(char key) { if (characters_.find(key) == characters_.end()) { characters_[key] = new ConcreteCharacter(key); } return characters_[key]; } ~CharacterFactory() { for (auto& pair : characters_) { delete pair.second; } } }; // 客户端代码 int main() { CharacterFactory factory; // 模拟文本中的字符 std::string text = "Hello, Flyweight!"; for (int i = 0; i < text.size(); ++i) { Character* character = factory.getCharacter(text[i]); character->display(i); // 位置是外在状态 } return 0; } </syntaxhighlight> === 输出示例 === <pre> Character 'H' at position 0 Character 'e' at position 1 Character 'l' at position 2 Character 'l' at position 3 Character 'o' at position 4 ... </pre> === 代码解析 === 1. '''ConcreteCharacter''' 存储内在状态(如字符符号),而外在状态(如位置)通过参数传递。 2. '''CharacterFactory''' 确保相同字符仅创建一个实例。 3. 客户端通过工厂获取享元对象,避免重复创建。
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)