作者Killercat (杀人猫™)
看板Programming
标题[分享] 人都是八卦的,所以...
时间Thu Apr 12 11:54:16 2012
※ [本文转录自 C_and_CPP 看板 #1FXSckDL ]
作者: Killercat (杀人猫™) 看板: C_and_CPP
标题: [分享] 人都是八卦的,所以...
时间: Thu Apr 12 02:13:00 2012
p.s. BBS程式码标色工具挂了,所以只好用丑丑的手动标色了 XD
人都是八卦的,所以
1. 如果有人以一个谣言为基础,换个人名就散布谣言,用这种方法散布多了,我们叫它
Prototype Pattern
典型的作法就是
Rumor r1 = (PoliticsRumor.clone()).setName("薄熙来");
Rumor r2 = (PoliticsRumor.clone()).setName("李登辉");
你看,这不就简单地创造了两个谣言吗
2. 如果有人用一组预设的谣言为基础,提供客户很多种东西让他可以用自己的元件客制
化谣言再散布出去,我们称为Builder Pattern
这种做法就是
Rumor r3 = (new SpicyRumor.Builder()).setName("某男星").setTarget("某女星").setPlace("薇阁").create();
你看,简单易懂
3. 如果有个人在需要新闻的时候,找个八卦聚集地,要他们制造出一个
我需要的种类的谣言,我们称为Factory。
(当然它本意不是这样,只是看起来会是这样 XD)
SportRumor r4 = (SportRumor) SystemManager.getRumorGenerator(Rumor.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(); //连接高层用
virtual void notify(SomeNotifyStructure&); //通知用
virtual void detach(); //高层失势後断绝联络用(咦?)
};
6. 如果我们有固定的好几个线民(比方说演艺圈,政治圈等等各一个线民),用这个线
民很方便地提供很多奇怪的资讯供很多不同的杂志制造出谣言,
这种情况游民共享的情况我们叫他做Flyweight
static RumorSource rs1 = PoliticsRumorSource.getInst();
///通常共用的东西我们用Singleton实作
static RumorSource rs2 = ActorRumorSource.getInst();
static RumorSource rs3 = SportRumorSource.getInst();
某日报出刊用这三个消息来源
public DailyNews DailyNewsFactory::createDailyNews() {
return DailyNews::createRumor(rs1, rs2, rs3);
}
某X周刊出刊一样用这三个消息来源 阿就createRumor实作有点差异而已
public TimeNews TimeNewsFactory::createTimeNews() {
return TimeNews::createRumor(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
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 转录者: Killercat (220.136.83.196), 时间: 04/12/2012 11:54:16
1F:推 sunneo::)) 220.132.1.247 05/14 04:08