首页 > 其他分享 >DesignPattern-part3

DesignPattern-part3

时间:2023-03-24 19:34:17浏览次数:35  
标签:draw const name void DesignPattern part3 Property string

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);
}

标签:draw,const,name,void,DesignPattern,part3,Property,string
From: https://www.cnblogs.com/sunstrikes/p/17253112.html

相关文章

  • DesignPattern-part2
    title:"modernC++DesignPattern-Part2"date:2018-04-10T19:08:49+08:00lastmod:2018-04-11T19:08:49+08:00keywords:[设计模式,C++]tags:[设计模式]categorie......
  • Word2vec之情感语义分析实战(part3)--利用分布式词向量完成监督学习任务
    引言这篇博客将基于前面一篇博客Part2做进一步的探索与实战。demo代码与数据:传送门单词的数值化表示前面我们训练了单词的语义理解模型。如果我们深入研究就会发......
  • rtk(redux)快速实践 创建一个Post part3 显示和编辑单个文章 添加用户 存储文章日期
    啊,标题好长捏。这篇对应文档这里呢!经过上一节,我们实践了最基本的rtk维护状态的流程在第三节:基本数据流中,我们看到了如何从一个空的Redux+React项目设置开始,添加一......
  • DesignPatternPrinciple-设计模式原则
    1.单一职责原则(SingleResponsibilityPrinciple)类T负责两个不同的职责:职责P1,职责P2。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSys......
  • 第七章 类和对象 Part3 类的静态成员
    静态成员在类定义中,它的成员(包括成员变量和成员函数),这些成员可以用关键字static声明为静态的,称为静态成员。不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被......
  • part3_CNN
    1CNN概述前面搭建的全连接神经网络是最初始的神经网络模型,非常自然的想法。但是并非所有数据都适合用全连接神经网络实现,同时使用全连接的深度模型,其连接数量太大,随着层......
  • UOJ pjudge LOJ 试题乱做 Part3
    加油加油,与\(\text{Part2}\)的结束无缝衔接了/ybyb.\(\text{【PER\#1】平均分}\)\(\color{green}{\text{[EASY]}}\)合理,我永远做不出\(brute\;force\)题.考......
  • Atcoder试题乱做 Part3
    最后一年了,一年不到,为了可爱的学长们,为了自己,要拼命了啊.\(\text{[AGC048D]PockyGame}\)\(\color{green}{\text{[EASY]}}\)怎么这都做不出来,废物啊.显然石......