FLYWEIGHT 享元模式
享元模式:FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。(简单点说就是不同的对象调用同样的功能函数)
每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,根据上下文情况使用。
代码示例
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <Windows.h> 4 #include <locale.h> 5 6 //定制结构体与函数,可以实现调用 7 struct messages 8 { 9 wchar_t *name; 10 wchar_t *message_str; 11 void(*p)(struct messages *pmsg); 12 }; 13 14 //最终调用的函数 15 void print(wchar_t *wstr) 16 { 17 wprintf(L"%ls ", wstr); 18 } 19 20 //定制消息 21 void dingzhi(struct messages *pmsg) 22 { 23 wchar_t wstr[300] = { 0 }; 24 wsprintf(wstr, L"%ls:%ls", pmsg->name, pmsg->message_str); 25 print(wstr); 26 } 27 28 void main() 29 { 30 setlocale(0, "zh-CN"); 31 wchar_t name[8] = L"小王"; 32 wchar_t msg[200] = L"你好"; 33 struct messages message1 { name, msg, dingzhi}; 34 //实现换一个名字其他都正常 35 wcscpy(name, L"小李"); 36 //自己定制 37 message1.p(&message1); 38 39 system("pause"); 40 }