[架构师训练营]Week03 - 作业
发布于: 2020 年 07 月 15 日
1 请在草稿纸上手写一个单例模式的实现代码,拍照提交作业
手撕singleton
请用组合设计模式编写程序,打印输出图 1 的窗口,窗口组件的树结构如图 2 所示,打印输出示例参考图
/*
设计模式之组合模式
composite模式中角色:
leaf(树叶)
表示内容的角色。在该角色中不能放入其他对象。
composite(复合物)
表示容器的角色。可以在其中放入leaf角色和composite角色。
component
使leaf角色和composite角色具有一致性的角色。
composite角色是leaf角色和composite角色的父类。
client
使用composite模式的角色。
*/
#include<string>#include<vector>#include<memory>#include<iostream>#include<algorithm>using std::string;using std::vector;using std::shared_ptr;using std::cout;using std::endl;using std::for_each;namespace RDTArchitecture{class Component{public: Component(string name):name_(name){} virtual void print() = 0; virtual void add(Component* c) = 0; virtual void remove(Component* c) =0;protected: string name_;};void printObj(shared_ptr<Component>& c){ c->print();}typedef shared_ptr<Component> ComponentPtr;class Composite:public Component{public: Composite(string name):Component(name){} void print(){ cout << "print " << name_<< "\r\n"; for_each(components_.begin(), components_.end(), printObj); } void add(Component* c){ ComponentPtr ptr(c); vector<ComponentPtr>::iterator it = find(components_.begin(), components_.end(),ptr); if( it == components_.end()){ components_.push_back(ptr); } } void remove(Component* c){ ComponentPtr ptr(c); vector<ComponentPtr>::iterator it = find(components_.begin(), components_.end(),ptr); if( it == components_.end()){ return; } components_.erase(it); }private: vector<ComponentPtr> components_;};class Leaf: public Component{public: Leaf(string name):Component(name){} void print(){ cout << "print " << name_<< "\r\n"; } void add(Component* c){ } void remove(Component* c){ }};};typedef shared_ptr<RDTArchitecture::Composite> CompositePtr;typedef shared_ptr<RDTArchitecture::Leaf> LeafPtr;int main(){ CompositePtr compositeObject(new RDTArchitecture::Composite("WINFORM(WINDOWS窗口)")); compositeObject->add(new RDTArchitecture::Leaf("Picture(LOGO图片)")); compositeObject->add(new RDTArchitecture::Leaf("Button(登录)")); compositeObject->add(new RDTArchitecture::Leaf("Button(注册)")); CompositePtr compositeObject1(new RDTArchitecture::Composite("Frame(FRAME1)")); compositeObject1->add(new RDTArchitecture::Leaf("Label(用户名)")); compositeObject1->add(new RDTArchitecture::Leaf("TextBox(文本框)")); compositeObject1->add(new RDTArchitecture::Leaf("Label(密码)")); compositeObject1->add(new RDTArchitecture::Leaf("PasswordBox(密码框)")); compositeObject1->add(new RDTArchitecture::Leaf("CheckBox(复选框)")); compositeObject1->add(new RDTArchitecture::Leaf("TextBox(记住用户名)")); compositeObject1->add(new RDTArchitecture::Leaf("LinkLabel(忘记密码)")); compositeObject->add(compositeObject1.get()); compositeObject->print(); return 0;}
划线
评论
复制
发布于: 2020 年 07 月 15 日 阅读数: 31
谭方敏
关注
还未添加个人签名 2019.10.22 加入
还未添加个人简介
评论 (1 条评论)