title: "modern C++ DesignPattern-Part3"
date: 2018-04-12T19:08:49+08:00
lastmod: 2018-04-12T19:08:49+08:00
keywords: [设计模式, C++]
tags: [设计模式]
categories: []

结构式设计模式的最后两个,享元模式:实现对象共享,减少内存开销;代理模式,提供相同接口的代理

flyweight

享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。boost::flyweight使用:

struct User2
{
flyweight<string> first_name, last_name; //类似一个缓存 User2(const string &first_name, const string &last_name)
: first_name(first_name),
last_name(last_name) {}
}; void boost_flyweight()
{
User2 user1{"John", "Smith"};
User2 user2{"Jane", "Smith"};
cout << user1.first_name << endl;
cout << boolalpha //std::boolalpha可以把bool变成true/false字符串
<< (&user1.first_name.get() == &user2.first_name.get()) << endl;
cout << boolalpha
<< (&user1.last_name.get() == &user2.last_name.get()) << endl;
}

示例:

class FormattedText {  //用来记录是否被复用的单元
string plain_text;
bool *caps;
public:
explicit FormattedText(const string &plainText)
: plain_text{plainText} {
caps = new bool[plainText.length()];
memset(caps, 0, plain_text.length());
} ~FormattedText() {
delete[] caps;
} void capitalize(int start, int end) {
for (int i = start; i <= end; ++i)
caps[i] = true;
} friend std::ostream &operator<<(std::ostream &os, const FormattedText &obj) {
string s;
for (int i = 0; i < obj.plain_text.length(); ++i) {
char c = obj.plain_text[i];
s += (obj.caps[i] ? toupper(c) : c);
}
return os << s;
}
}; class BetterFormattedText {
public:
struct TextRange {
int start, end;
bool capitalize, bold, italic; bool covers(int position) const {
return position >= start && position <= end;
}
}; TextRange &get_range(int start, int end) { //每当设置一个被复用的单元,push到vector里面,返回最后一个
formatting.emplace_back(TextRange{start, end});
return *formatting.rbegin();
} explicit BetterFormattedText(const string &plainText)
: plain_text{plainText} {
} friend std::ostream &operator<<(std::ostream &os, const BetterFormattedText &obj) {
string s;
for (size_t i = 0; i < obj.plain_text.length(); i++) {
auto c = obj.plain_text[i];
for (const auto &rng : obj.formatting) {
if (rng.covers(i) && rng.capitalize)
c = toupper(c);
}
s += c; // fixed!
}
return os << s;
} private:
string plain_text;
vector<TextRange> formatting;
};

Proxy

代理模式最经典的是shared_ptr实现,增加了引用计数的同时保持了原有的普通指针接口

Property Proxy

template <typename T> struct Property {
T value;
Property(const T initialValue) {
*this = initialValue;
}
operator T() { //getter
return value;
}
T operator =(T newValue) { //setter
return value = newValue;
}
};
//usage
struct Creature
{
Property<int> strength{ 10 };
Property<int> agility{ 5 };
};
void property_proxy() {
Creature creature;
creature.agility = 20;
cout << creature.agility << endl;
}

主要目的是可以允许 Property<int>与int的随时转换。

Virtual Proxy

这种非常常见,使用时分两种,eager模式和lazy模式,区别就是lazy模式是在使用的时候才会初始化

struct Image{
virtual ~Image() = default;
virtual void draw() = 0;
};
struct Bitmap : Image{
Bitmap(const string& filename) {
cout << "Loading image from " << filename << endl;
}
void draw() override {
cout << "Drawing image" << endl;
}
};
struct LazyBitmap : Image {
LazyBitmap(const string& filename): filename(filename) {}
~LazyBitmap() { delete bmp; }
void draw() override {
if (!bmp)
bmp = new Bitmap(filename);
bmp->draw();
}
private:
Bitmap* bmp{nullptr};
string filename;
}; void draw_image(Image& img) {
img.draw();
}
void virtual_proxy() {
LazyBitmap img{ "pokemon.png" };
draw_image(img); // loaded whether the bitmap is loaded or not
draw_image(img);
}

DesignPattern-part3的更多相关文章

  1. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  2. Linux平台 Oracle 11gR2 RAC安装Part3:DB安装

    四.DB(Database)安装 4.1 解压DB的安装包 4.2 DB软件安装 4.3 ASMCA创建磁盘组 4.4 DBCA建库 4.5 验证crsctl的状态 Linux平台 Oracle 11 ...

  3. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  4. 小课堂Week10 例外处理设计的逆袭Part3

    小课堂Week10 例外处理设计的逆袭Part3 今天是<例外处理设计的逆袭>这本书阅读的第三天,也是最后一天,我们会主要通过实例,对Part2中提出的例外处理等级进行解读. Level1 ...

  5. Linux平台 Oracle 12cR2 RAC安装Part3:DB安装

    Linux平台 Oracle 12cR2 RAC安装Part3:DB安装 四.DB(Database)安装 4.1 解压DB的安装包 4.2 DB软件安装 4.3 ASMCA创建磁盘组 4.4 DBC ...

  6. Python学习 Part3:数据结构

    Python学习 Part3:数据结构 1. 深入列表: 所有的列表对象方法 list.append(x): 在列表的末尾添加一个元素 list.extend(L): 在列表的末尾添加一个指定列表的所 ...

  7. Linux平台 Oracle 18c RAC安装Part3:DB配置

    四.DB(Database)配置 4.1 解压DB的安装包 4.2 DB软件配置 4.3 ASMCA创建磁盘组 4.4 DBCA建库 4.5 验证crsctl的状态 Linux平台 Oracle 18 ...

  8. java 设计模式http://www.runoob.com/design-pattern/design-pattern-tutorial.html

    参考:http://www.runoob.com/design-pattern/design-pattern-tutorial.html

  9. 运放参数的详细解释和分析-part3,输入失调电压Vos及温漂

    运放参数的详细解释和分析-part3,输入失调电压Vos及温漂 在运放的应用中,不可避免的会碰到运放的输入失调电压Vos问题,尤其对直流信号进行放大时,由于输入失调电压Vos的存在,放大电路的输出端总 ...

  10. 结对作业——四则运算 Part3. 对于结对编程的总结与思考

    结对作业——四则运算 Part3. 对于结对编程的总结与思考 PB15061303 刘梓轩PB16061489 艾寅中 GITHUB 地址 戳这里 目录 Part 1. Core代码编写部分 Part ...

随机推荐

  1. AcWing 278. 数字组合

    给定 N 个正整数 A1,A2,-,AN,从中选出若干个数,使它们的和为 M,求有多少种选择方案. 输入格式 第一行包含两个整数 N 和 M. 第二行包含 N 个整数,表示 A1,A2,-,AN. 输 ...

  2. 小程序 Page "pages/posts/post-detail/post-detail" has not been registered yet.

    今使用wx.navigateTo进行页面跳转老是提示Page "pages/posts/post-detail/post-detail" has not been register ...

  3. 顶级生物信息学 RSS 订阅源

    早在 2018 年的时候我在"生信草堂"的公众号上写过一篇关于 RSS 的文章<使用 RSS 打造你的科研资讯头条>,介绍了关于 RSS 的一些内容和如何使用 inor ...

  4. DOS系统中EXE程序加载过程

    1.在内存区中寻找一段容量足够的空闲内存区. 2.这段内存区的前256字节中,创建一个称为程序段前缀(PSP)的数据区. 3.这段内存区256字节之后,将程序装入,程序的地址被设为SA+10H : 0 ...

  5. 如何获取 C#程序 内核态线程栈

    一:背景 1. 讲故事 在这么多的案例分析中,往往会发现一些案例是卡死在线程的内核态栈上,但拿过来的dump都是用户态模式下,所以无法看到内核态栈,这就比较麻烦,需要让朋友通过其他方式生成一个蓝屏的d ...

  6. Python-Loguru:让记录日志更装13

    " 今天勇哥来介绍一款让日志记录在 Python 中变得更加轻松愉快的库--Loguru.它提供了强大的功能和简洁的接口,使我们能够以更加灵活和直观的方式记录和管理日志信息,据说比loggi ...

  7. 什么是Sparse by default for crates.io

    当 Rust crate 发布到 crates.io 上时,可以启用"Sparse by default"特性,这意味着默认情况下,crate 不会包含所有依赖项在上传到 crat ...

  8. OAuth2.0andmultifactorauthentication:Howtocreateasecure

    目录 1. 引言 2. 技术原理及概念 2.1. 基本概念解释 2.2. 技术原理介绍 2.3. 相关技术比较 3. 实现步骤与流程 3.1. 准备工作:环境配置与依赖安装 随着数字化时代的到来,人们 ...

  9. 走近高德驾车ETA(预估到达时间)

    1. 什么是驾车ETA 临近节假,长途自驾返乡的你是否曾为无法预知路上到底有多堵而纠结?通勤上班,作为有车一族的你是否在为路况变幻莫测的早晚高峰而烦恼?外出旅行,赶火车.赶飞机的你是否还在为担心错过班 ...

  10. ZEGO全新语音聊天室方案,2小时复刻 Clubhouse

    真的火了! 新晋带货王马斯克在 Clubhouse"开房"之后,直接让 Clubhouse 爆火出圈,据说,Clubhouse 平台邀请码现在在ebay上已经卖到了快200刀一个. ...