作者Killercat (杀人猫™)
看板C_and_CPP
标题[分享] 人都是八卦的,所以...
时间Thu Apr 12 02:13:00 2012
p.s. BBS程式码标色工具挂了,所以只好用丑丑的手动标色了 XD
人都是八卦的,所以
1. 如果有人以一个谣言为基础,换个人名就散布谣言,用这种方法散布多了,我们叫它
Prototype Pattern
典型的作法就是
PolicyRumor* prPrototype = PolicyRumor::getPrototype(); //取得原形
Rumor* r1 = (prPrototype->clone())->setName("薄熙来");
Rumor* r2 = (prPrototype->clone())->setName("李登辉");
你看,这不就简单地创造了两个谣言吗
2. 如果有人用一组预设的谣言为基础,提供客户很多种东西让他可以用自己的元件客制
化谣言再散布出去,我们称为Builder Pattern
这种做法就是
Rumor* r3 = (SpicyRumor::createBuilder())->setName("某男星")->setTarget("某女星")->setPlace("薇阁")->create();
你看,简单易懂
3. 如果有个人在需要新闻的时候,找个八卦聚集地,要他们制造出一个
我需要的种类的谣言,我们称为Factory。
(当然它本意不是这样,只是看起来会是这样 XD)
SportRumor* r4 = static_cast<SportRumor*>(AppleDaily::getRumorGenerator(RumorType::Sport)->createRumor());
4. 如果有人有个固定的写手,提供一组号码跟不同分机,让每个人都可以打电话进去
提供线索,打不同分机提供不同谣言,我们称为Abstract Factory Pattern
UncontainedRumor* r5 = AppleDaily::createRumor(分机号码& 分机);
老实讲3跟4很像,我也常常搞混
虽然他们意思完全天差地远
5. 如果有高层过来关切,要求我们每制造一组谣言一定要跟他们说,这种情况我们称为
Observer pattern
//也许高层会希望"监测爆料"这件事情保密,所以要用private继承而非protect/public?
class RumorFactory : protected HighLevelTelephoneNotify {
Rumor createRumor();
virtual void attach(const HighLevel&); //连接高层用
virtual void notify(const SomeNotifyStructure&); //通知用
virtual void detach(const HighLevel&); //高层失势後断绝联络用(咦?)
};
6. 如果我们有固定的好几个线民(比方说演艺圈,政治圈等等各一个线民),用这个线
民很方便地提供很多奇怪的资讯供很多不同的杂志制造出谣言,
这种情况游民共享的情况我们叫他做Flyweight
static RumorSource& rs1 = PoliticsRumorSource::getInst();
///通常共用的东西我们用Singleton实作
static RumorSource& rs2 = ActorRumorSource::getInst();
static RumorSource& rs3 = SportRumorSource::getInst();
某日报出刊用这三个消息来源
public DailyNews* DailyNewsFactory::createDailyNews() {
return DailyNews::createFromRumor(rs1, rs2, rs3);
}
某X周刊出刊一样用这三个消息来源 阿就createRumor实作有点差异而已
public TimeNews* TimeNewsFactory::createTimeNews() {
return TimeNews::createFromRumor(rs1, rs2);
}
说真的,他们这种作法,狠一点的我还可以写个template用policy pattern表达出来
不过这离题了 XD
7. 如果我们希望能够多听一些谣言,提供了一组可抛弃的信箱(防止收到垃圾信)来接
收这些谣言,这称为Delegate pattern
class ISelectedNewsSource {
//这个const还挺重要的,请务必维持这个好习惯 这很重要
//前面的boolean通常可以告诉source这次的update你还要不要继续读下去
virtual boolean onPolicyRumorFetched(const PolicyRumor&);
virtual boolean onActorRumorFetched(const ActorRumor&);
...
...
}
class MySourceHandler : protected ISelectedNewsSource {
...
...
...
}
ISelectedNewsSource* source = new MySourceHandler;
dailyNews.setOnPublishCallback(source);
8 最後,当我们嫌这些谣言好烦,再也不想听到这些加油添醋的讯息了,我们就可以把
Adapter/Bridge拔掉,用自己的判断去评论收到的讯息
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.192.252.25
※ Killercat:转录至看板 Programming 04/12 11:54
1F:→ diabloevagto:看不太懂这个八卦... 04/12 12:48
2F:→ Killercat:不过就是在说明一些design pattern运作原理而已 orz 04/12 13:12
3F:→ angleevil:= =拍谢,我功力不够.我也看不懂... 04/12 13:34
4F:→ iWRZ:怎麽看起来像Java? 04/12 13:41
5F:推 iamstudent:这篇是在讲Design Pattern,用的语言是java 04/12 13:53
6F:→ iamstudent:有点偏离本版讨论了,dp有OOAD可以讨论,java也有专版 04/12 13:54
7F:→ Killercat:我是java写多了 不过除了两个地方少了个*以外 04/12 14:04
8F:→ Killercat:这看起来应该基本上都是C++才对啊(抓头) 04/12 14:04
9F:→ Killercat:我个人因为习惯用ref来取代pointer 所以->用得比较少 04/12 14:05
10F:→ Killercat:会不会是因为这原因让你们觉得像java? 04/12 14:05
11F:→ Killercat:阿我知道为什麽了,有些地方的确写成java了 我改一下XD 04/12 14:06
12F:→ Killercat:java写多了 一些C++的东西都会不小心混进奇怪code进去 04/12 14:12
※ 编辑: Killercat 来自: 220.136.83.196 (04/12 14:35)
13F:推 purpose:可以留下 JAVA / C++ 的作法,这样符合此版,又能比对 04/12 14:42
14F:→ purpose:语言切来切去,容易搞混。这篇内容比较精链吧,我只看懂 04/12 14:44
15F:→ purpose:一点,有些前因後果原PO稍微省略了,所以罗... 04/12 14:44
16F:→ Killercat:其实这篇由来是这样的 =P 中共前阵子不是因为北京一些 04/12 14:46
17F:→ Killercat:事件以谣言为理由封锁了几个网站,我刚好跟几个geek的 04/12 14:46
18F:→ Killercat:工程师聊到这个,又刚好聊到design pattern 04/12 14:46
19F:→ Killercat:所以我就写了这篇让大家笑一下 XD 04/12 14:47
20F:→ Killercat:基本上对看不懂paattern的可能没什麽帮助(比方说第一个 04/12 14:47
21F:→ Killercat:prototype的核心就是->clone()) 看得懂的就当工程师笑话 04/12 14:47
22F:→ Killercat:看看笑笑就好了 XD 04/12 14:48
23F:→ Killercat:基本上我想用过这些pattern的应该都能会心一笑 04/12 14:48
24F:推 iWRZ:个人想问 pattern 纯C可以写出来吗? 04/12 16:56
25F:→ Killercat:我可以跟你说 struct mask是无敌的 只是好不好用 XD 04/12 17:14
26F:→ Killercat:没有人愿意用struct mask+macro模拟出一堆继承feature 04/12 17:15
27F:→ Killercat:我们可以反过来说 有什麽事malloc+memset写不出来的XD 04/12 17:15
28F:→ angleevil:有阿,被ooc逼退的头发,写不回来(认真).所以我不碰那个 04/12 17:26
30F:推 fengchu:回应i大。patterns和程式语言的种类高度相关。在C里用函式 04/12 18:55
31F:→ fengchu:指标阵列也算是一种pattern。在functional PL里的pattern 04/12 18:55
32F:→ fengchu:与OOPL里的patterns也不太一样。 04/12 18:56
33F:推 mingtai1:第一个prototype pattern感觉常常很像template pattern.. 04/12 21:30
34F:→ Killercat:template比较类似填洞(像builder),prototype比较像是 04/12 22:22
35F:→ Killercat:你要生出一大群只差一个两个相异点的物件 04/12 22:22
36F:→ Killercat:当然你可以有很多种prototype 然後挑一个clone... 04/12 22:23
37F:推 FAITHY:好强 能知道->清楚分辨->活用 这些设计概念好厉害 ... 04/12 23:26
38F:→ Killercat:其实我想说的是,Design Pattern是一种殊途同归的结果 04/13 09:49
39F:→ Killercat:就算你没看过DP,当你很有经验的时候,你会发现你用的 04/13 09:49
40F:→ Killercat:方法会跟大多数有经验的人一样,刚好也跟DP一样 04/13 09:50
41F:→ Killercat:其实除了少部分非常高深的pattern(多半跟template有关, 04/13 09:50
42F:→ Killercat:比方说policy pattern这真的需要点才华)以外,大多数的 04/13 09:51
43F:→ Killercat:patterns(像是GOF写的那本硬壳书)都是迟早自己会写到的 04/13 09:52
44F:→ Killercat:不过这些需要才华的多半也被冠上design之名了 04/13 09:53
45F:推 tomap41017:推上面最後这段 04/13 13:50
46F:→ tomap41017:原PO写得真的很棒!推 04/13 13:50
47F:推 damody:推呀!C++无误,不过第二个的new好像没有delete 04/14 03:46
48F:→ Killercat:builder有一种做法是.create()里面delete this; 04/14 10:48
49F:→ Killercat:当然这不是一个好的写法 因为谁new应该就要谁delete 04/14 10:48
50F:→ Killercat:所以第二个应该改成::createBuilder()->...->create(); 04/14 10:49
51F:→ Killercat:createBuilder()做一个new Builder()这样 @@a 04/14 10:49
※ 编辑: Killercat 来自: 123.192.252.25 (04/14 10:52)
※ 编辑: Killercat 来自: 123.192.252.25 (04/14 10:52)
52F:推 damody:推新版本不用 delete 04/20 06:55