[架构师训练营]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;
}



用户头像

谭方敏

关注

还未添加个人签名 2019.10.22 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
请添加“极客大学架构师训练营”标签
2020 年 07 月 15 日 10:55
回复
没有更多了
[架构师训练营]Week03 - 作业