【单例模式】
单例模式是在程序运行的整个生命周期,该类只有一个实例,这样可以确保任何的引用处得到的数据都是一致的。 比如,一个人力资源管理类,在某一个时刻用户在某个类中点击了就添加一个人员,在某一个时刻用户在另一个类中点击了按钮要查看人员,这时候不管何时,人力资源类都要保持数据统一
#include <iostrem>
class A
{
public:
void addPerson(const std::string& name)
{
m_persons.push_back(name);
}
std::vector<std::string> getPersons()
{
return m_persons;
}
private:
std::vector<std::string> m_persons;
}
class B
{
public:
void clickButtonToAddPerson(const std::string& name)
{
A::GetInstance().addPerson(name);
}
private:
A m_a;
}
class C
{
public:
void clickButtonToShowPersons()
{
std::vector<std::string> persons = A::GetInstance().getPersons();
for (const auto& person : persons)
{
std::cout << person << std::endl;
}
}
private:
A m_a;
}
int main(void)
{
B b;
b.clkckButtonToAddPerson("caoyanjie");
C c;
c.clickButtonToShowPersons();
return 0;
}
【装饰器模式】
1. C++版
#include <iostream>
#include <string>
// 形状
struct Shape
{
virtual std::string str() = 0;
};
// 圆
struct Circle : Shape
{
// 重载基类虚函数
std::string str() override
{
return std::string("圆的半径为:") + std::to_string(m_radius);
}
private:
float m_radius = 10.0f;
};
// 形状颜色
struct ColorShape : Shape
{
ColorShape(std::string color, Shape* shape)
{
m_color = color;
m_shape = shape;
}
// 重载基类虚函数
std::string str() override
{
return m_shape->str() + std::string(" 颜色为:") + m_color;
}
private:
std::string m_color;
Shape* m_shape;
};
int main()
{
Circle c;
ColorShape cc("红色", &c);
std::cout << cc.str() << std::endl; // 结果为:
}
2. Python版
# 加粗
def makebold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped
# 加斜
def makeitalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped
# 加斜再加粗
@makebold
@makeitalic
def hello():
return "hello world"
print(hello()) # 结果为: <b><i>hello world</i></b>