(Boolan) C++設(shè)計(jì)模式 第三周筆記(二)

狀態(tài)模式

一呵哨、描述

概念:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為刹前。 對(duì)象看起來(lái)似乎修改了它的類毛嫉。

問(wèn)題:

每個(gè)人袱饭、事物在不同的狀態(tài)下會(huì)有不同表現(xiàn)(動(dòng)作),而一個(gè)狀態(tài)又會(huì)在不同的表現(xiàn)下轉(zhuǎn)移到下一個(gè)不同的狀態(tài)(State)川无。 最簡(jiǎn)單的一個(gè)生活中的例子就是:

地鐵入口處,如果你放入正確的地鐵票,門就會(huì)打開讓你通過(guò)。 在出口處也是驗(yàn)票,如果正確你就可以 ok,否則就不讓你通過(guò)(如果你動(dòng)作野蠻,或許會(huì)有報(bào)警(Alarm),:)虑乖。

有限狀態(tài)自動(dòng)機(jī)(FSM)也是一個(gè)典型的狀態(tài)不同,對(duì)輸入有不同的響應(yīng)(狀態(tài)轉(zhuǎn)移)懦趋。 通常我們?cè)趯?shí)現(xiàn)這類系統(tǒng)會(huì)使用到很多的Switch/Case語(yǔ)句,Case某種狀態(tài),發(fā)生什么動(dòng)作,Case 另外一種狀態(tài),則發(fā)生另外一種狀態(tài)。 但是這種實(shí)現(xiàn)方式至少有以下兩個(gè)問(wèn)題:

1)當(dāng)狀態(tài)數(shù)目不是很多的時(shí)候,Switch/Case 可能可以搞定疹味。 但是當(dāng)狀態(tài)數(shù)目很多的時(shí)候(實(shí)際系統(tǒng)中也正是如此),維護(hù)一大組的 Switch/Case 語(yǔ)句將是一件異常困難并且容易出錯(cuò)的事情仅叫。

2)狀態(tài)邏輯和動(dòng)作實(shí)現(xiàn)沒(méi)有分離。 在很多的系統(tǒng)實(shí)現(xiàn)中,動(dòng)作的實(shí)現(xiàn)代碼直接寫在狀態(tài)的邏輯當(dāng)中糙捺。 這帶來(lái)的后果就是系統(tǒng)的擴(kuò)展性和維護(hù)得不到保證诫咱。

模式選擇

State 模式就是被用來(lái)解決上面列出的兩個(gè)問(wèn)題的,在 State 模式中我們將狀態(tài)邏輯和動(dòng)作實(shí)現(xiàn)進(jìn)行分離。 當(dāng)一個(gè)操作中要維護(hù)大量的 case 分支語(yǔ)句,并且這些分支依賴于對(duì)象的狀態(tài)洪灯。 State 模式將每一個(gè)分支都封裝到獨(dú)立的類中坎缭。

State 模式典型的結(jié)構(gòu)圖為:

備忘錄模式

一、描述:

? 沒(méi)有人想犯錯(cuò)誤,但是沒(méi)有人能夠不犯錯(cuò)誤签钩。犯了錯(cuò)誤一般只能改過(guò),卻很難改正(恢復(fù))掏呼。世界上沒(méi)有后悔藥,但是我們?cè)谶M(jìn)行軟件系統(tǒng)的設(shè)計(jì)時(shí)候是要給用戶后悔的權(quán)利(實(shí)際上可能也是用戶要求的權(quán)利:),我們對(duì)一些關(guān)鍵性的操作肯定需要提供諸如撤銷(Undo) 的操作。那這個(gè)后悔藥就是 Memento 模式提供的铅檩。

? Memento 模式的關(guān)鍵就是要在不破壞封裝行的前提下,捕獲并保存一個(gè)類的內(nèi)部狀態(tài),這樣就可以利用該保存的狀態(tài)實(shí)施恢復(fù)操作哄尔。為了達(dá)到這個(gè)目標(biāo),可以在后面的實(shí)現(xiàn)中看到我們采取了一定語(yǔ)言支持的技術(shù)。

**Memento 模式的典型結(jié)構(gòu)圖為: **

二柠并、實(shí)例

備忘錄:Memento類

Memento.h

#ifndef __Memento__Memento__?

#define __Memento__Memento__?


#include ?

#include ?

using namespace std;?


class Memento?

{?

public:?


protected:?


private:?

? ? //這是最關(guān)鍵的地方,將 Originator 為 friend 類,可以訪問(wèn)內(nèi)部信息,但是其他類不能訪問(wèn)?

? ? friend class Originator; typedef string State;?

? ? Memento();?

? ? Memento(const State& sdt); ~Memento();?

? ? void SetState(const State& sdt); State GetState();?


private:?

? ? State _sdt;?

};?

Memento.cpp

#include "Memento.h"?

typedef string State;?

Memento::Memento()?

{?

}?

Memento::Memento(const State& sdt)?

{?

? ? this->_sdt = sdt;?

}?

State Memento::GetState()?

{?

? ? return this->_sdt;?

}?

void Memento::SetState(const State& sdt)?

{?

? ? this->_sdt = sdt;?

}?

撤銷返回操作:originator類

originator.h

#ifndef __Memento__Originator__?

#define __Memento__Originator__?


#include ?

#include ?

#include "Memento.h"?

using namespace std;?

class Originator?

{?

public:?

? ? typedef string State; Originator();?

? ? Originator(const State& sdt);?

? ? ~Originator();?

? ? Memento* CreateMemento();?

? ? void SetMemento(Memento* men);?

? ? void RestoreToMemento(Memento* mt);?

? ? State GetState();?

? ? void SetState(const State& sdt);?

? ? void PrintState();?


protected:?

private:?

? ? State _sdt;?

? ? Memento* _mt;?

};?

Originator.cpp

#include "Originator.h"?

typedef string State;?


Originator::Originator()?

{?

? ? this->_sdt = "";?

? ? this->_mt = 0;?

}?

Originator::Originator(const State& sdt)?

{?

? ? this->_sdt = sdt;?

? ? this->_mt = 0;?

}?

Originator::~Originator()?

{?


}?


Memento* Originator::CreateMemento()?

{?

? ? return new Memento(_sdt);?

}?


State Originator::GetState()?

{?

? ? return this->_sdt;?

}?


void Originator::SetState(const State& sdt)?

{?

? ? this->_sdt = sdt;?

}?


void Originator::PrintState()?

{?

? ? cout<_sdt<<"....."<

}?


void Originator::SetMemento(Memento* men)?

{?


}?


void Originator::RestoreToMemento(Memento* mt)?

{?

? ? this->_sdt = mt->GetState();?

}?

主程序:main

main.cpp

#include ?

#include "Memento.h"?

#include "Originator.h"?

using namespace std;?


int main(int argc, const char * argv[])?

{?


? ? // insert code here...?

? ? Originator *myOriginator = new Originator();?

? ? myOriginator->SetState("備忘狀態(tài)old");//備忘前狀態(tài)?

? ? myOriginator->PrintState();?


? ? Memento *myMemento = myOriginator->CreateMemento();//將狀態(tài)備忘?


? ? myOriginator->SetState("修改狀態(tài)new");//修改狀態(tài)?

? ? myOriginator->PrintState();?

? ? myOriginator->RestoreToMemento(myMemento);//恢復(fù)修改前狀態(tài)?

? ? myOriginator->PrintState();?



? ? std::cout << "Hello, World!\n";?

? ? return 0;?

}?

Memento 模式的關(guān)鍵就是 friend class Originator;我們可以看到,Memento 的接口都聲明為 private,而將 Originator 聲明為 Memento 的友元類岭接。 我們將 Originator 的狀態(tài)保存在 Memento 類中,而將 Memento 接口 private 起來(lái),也就達(dá)到了封裝的功效富拗。 在 Originator 類中我們提供了方法讓用戶后悔:RestoreToMemento(Memento* mt);我們可以 通過(guò)這個(gè)接口讓用戶后悔宴咧。 在測(cè)試程序中,我們演示了這一點(diǎn):Originator 的狀態(tài)由 old 變?yōu)?new 最 后又回到了 old示弓。

命令模式

一、描述:

? 命令模式堪嫂,將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象窄锅,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化创千;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可撤消的操作入偷。應(yīng)該是一個(gè)比較簡(jiǎn)單的模式了追驴。

** Command 模式的典型結(jié)構(gòu)圖為: **

? Command 模式結(jié)構(gòu)圖中,將請(qǐng)求的接收者(處理者)放到 Command 的具體子類ConcreteCommand 中,當(dāng)請(qǐng)求到來(lái)時(shí)(Invoker 發(fā)出 Invoke 消息激活 Command 對(duì)象),ConcreteCommand 將處理請(qǐng)求交給 Receiver 對(duì)象進(jìn)行處理。

二疏之、實(shí)例:

描述:

今天講命令模式,這個(gè)模式從名字上看就很簡(jiǎn)單,命令嘛,老大發(fā)命令,小兵執(zhí)行就是了,確實(shí)是這個(gè)意思,但是更深化了,用模式來(lái)描述真是是世界的命令情況殿雪。 正在看這本書的你,我猜測(cè)分為兩類:已經(jīng)工作的和沒(méi)有工作的,先說(shuō)沒(méi)有工作的,那你為啥要看這本書,為了以后工作唄,只要你參見(jiàn)工作,你肯定會(huì)待在項(xiàng)目組,那今天我們就以項(xiàng)目組為例子來(lái)講述命令模式。

我是我們部門的項(xiàng)目經(jīng)理,就是一個(gè)項(xiàng)目的頭,在中國(guó)做項(xiàng)目,項(xiàng)目經(jīng)理就是什么都要懂,什么都要管,做好了項(xiàng)目經(jīng)理能分到一杯羹,做不好都是你項(xiàng)目經(jīng)理的責(zé)任,這個(gè)是絕對(duì)的,我?guī)н^(guò)太多的項(xiàng)目,行政命令一壓下來(lái), 那就一條道,做完做好!我們雖然是一個(gè)集團(tuán)公司,但是我們部門是獨(dú)立核算的,就是說(shuō)呀,我們部門不僅僅為我們集團(tuán)服務(wù),還可以為其他甲方服務(wù),賺取更多的外快,所以俺們的工資才能是中上等锋爪。 在 2007 年我?guī)ьI(lǐng)了一個(gè)項(xiàng)目,比較小,但是錢可不少,是做什么的呢?為一家旅行社建立一套內(nèi)部管理系統(tǒng),管理他的客戶丙曙、旅游資源、票務(wù)以及內(nèi)部管理,整體上類似一個(gè)小型的 ERP 系統(tǒng),門店比較多,員工也比較多,但是需求比較明確, 因?yàn)樗麄冎坝幸惶鬃约嘿?gòu)買的內(nèi)部管理系統(tǒng),這次變動(dòng)部分模塊基本上是翻版,而且旅行社有自己的IT 部門,比較好相處,都是技術(shù)人員,沒(méi)有交流鴻溝嘛其骄。

這個(gè)項(xiàng)目的成員分工也是采用了常規(guī)的分工方式,分為需求組(Requirement Group,簡(jiǎn)稱 RG)亏镰、美工組(Page Group,簡(jiǎn)稱 PG)、代碼組(我們內(nèi)部還有一個(gè)比較優(yōu)雅的名字:邏輯實(shí)現(xiàn)組, 這里使用大家經(jīng)常稱呼的名稱吧,英文縮寫叫 Code Group,簡(jiǎn)稱 CG),總共加上我這個(gè)項(xiàng)目經(jīng)理正好十個(gè)人,剛開始的時(shí)候客戶(也就是旅行社,甲方)還是很樂(lè)意和我們每個(gè)組探討,比如和需求組討論需求,和美工討論頁(yè)面, 和代碼組討論實(shí)現(xiàn),告訴他們修改這里,刪除這里,增加這些等等,這是一種比較常見(jiàn)的甲乙方合作模式,甲方深入到乙方的項(xiàng)目開發(fā)中,我們把這個(gè)模式用類圖表示一下:

但是問(wèn)題來(lái)了,我們修改可以,但是每次都是叫一個(gè)組去,布置個(gè)任務(wù),然后出計(jì)劃,次次都這樣,如果讓你當(dāng)甲方也就是客戶,你煩不煩?而且這種方式很容易出錯(cuò)誤呀,而且還真發(fā)生過(guò),客戶把美工叫過(guò)去了,要?jiǎng)h除,可美工說(shuō)需求是這么寫的, 然后客戶又命令需求組過(guò)去,一次次的折騰,客戶也煩躁了,于是直接抓住我這個(gè)項(xiàng)目經(jīng)理說(shuō):

“我不管你們內(nèi)部怎么安排,你就給我找個(gè)接頭人,我告訴他怎么做,刪除頁(yè)面了,增加功能了,你們內(nèi)部 怎么處理, 我就告訴他我要干什么就成了...”我一聽(tīng),好呀,這也正是我想要的,我項(xiàng)目組的兄弟們也已經(jīng)受不了了,于是我改變了一下我的處理方式, 看看類圖(類圖稍微更改下名稱):

注釋:

main()拯爽,客戶

Invoker索抓,命令接收者,如項(xiàng)目經(jīng)理

IGroup毯炮,執(zhí)行者接口

CRequirementGroup纸兔,需要組

CPageGroup,美工組

CCodePage否副,代碼組

ICommand汉矿,命令接口

CAddRequirementCommand,執(zhí)行增加一項(xiàng)需求的命令( Execute函數(shù)备禀,將調(diào)用CRequirementGroup的多個(gè)命令洲拇。 來(lái)組合執(zhí)行用戶發(fā)出的命令。 )

CDeletePageCommand曲尸,執(zhí)行刪除一個(gè)頁(yè)面的命令

命令接收者:InvokerInvoker.h

#ifndef __Command__Invoker__?

#define __Command__Invoker__?


#include ?

#include "ICommand.h"?


class CInvoker?

{?

public:?

? ? CInvoker(void);?

? ? ~CInvoker(void);?

? ? void SetCommand(ICommand *pcommand);?

? ? void Action();?

private:?

? ? ICommand *m_pCommand;?

};?


Invoker.cpp

#include "Invoker.h"?

CInvoker::CInvoker(void)?

{?

}?

CInvoker::~CInvoker(void)?

{?

}?

void CInvoker::SetCommand( ICommand *pcommand )?

{?

? ? this->m_pCommand = pcommand;?

}?

void CInvoker::Action()?

{?

? ? this->m_pCommand->Execute();?

}?

命令接口:IComman類

ICommand.h

#ifndef Command_ICommand_h?

#define Command_ICommand_h?

#include "RequirementGroup.h"?

#include "PageGroup.h"?

#include "CodeGroup.h"?


class ICommand {? ?

public:?


? ? ICommand(void)?

? ? {?

? ? ? ? m_prg = new CRequirementGroup();?

? ? ? ? m_ppg = new CPageGroup();?

? ? ? ? m_pcg = new CCodeGroup();?

? ? }?

? ? virtual ~ICommand(void)?

? ? {?

? ? ? ? delete m_prg;?

? ? ? ? delete m_ppg;?

? ? ? ? delete m_pcg;?

? ? }?

? ? virtual void Execute() = 0;?


protected:?


? ? CRequirementGroup *m_prg;?

? ? CPageGroup *m_ppg;?

? ? CCodeGroup *m_pcg;?


};?


執(zhí)行增加一項(xiàng)需求的命令:CAddRequirementCommand類

CAddRequirementCommand.h

#ifndef __Command__AddRequirementCommand__?

#define __Command__AddRequirementCommand__?


#include ?

#include "ICommand.h"?

class CAddRequirementCommand :public ICommand?

{?

public:?

? ? CAddRequirementCommand(void);?

? ? ~CAddRequirementCommand(void);?

? ? void Execute();?

};?


AddRequirementCommand.cpp

#include "AddRequirementCommand.h"?


CAddRequirementCommand::CAddRequirementCommand(void)?

{?

}?

CAddRequirementCommand::~CAddRequirementCommand(void)?

{?

}?

void CAddRequirementCommand::Execute()?

{?

? ? //執(zhí)行增另一項(xiàng)需求的命令?

? ? this->ICommand::m_prg->Find();?


? ? //增加一份需求?

? ? this->ICommand::m_prg->Add();?


? ? //給出計(jì)劃?

? ? this->ICommand::m_prg->Plan();?

}?

執(zhí)行刪除一個(gè)頁(yè)面的命令 :CDeletePageCommand類

CDeletePageCommand.h

#ifndef __Command__DeletePageCommand__?

#define __Command__DeletePageCommand__?


#include ?

#include "ICommand.h"?


class CDeletePageCommand :?

public ICommand?

{?

public:?

? ? CDeletePageCommand(void);?

? ? ~CDeletePageCommand(void);?

? ? void Execute();?

};?


DeletePageCommand.cpp

**[cpp]** [view plain](http://blog.csdn.net/rexuefengye/article/details/13004205#) [copy](http://blog.csdn.net/rexuefengye/article/details/13004205#)

#include "DeletePageCommand.h"?


CDeletePageCommand::CDeletePageCommand(void)?

{?

}?

CDeletePageCommand::~CDeletePageCommand(void)?

{?

}?

void CDeletePageCommand::Execute()?

{?

? ? //執(zhí)行增另一項(xiàng)需求的命令?

? ? this->ICommand::m_ppg->Find();?


? ? //增加一份需求?

? ? this->ICommand::m_ppg->Delete();?


? ? //給出計(jì)劃?

? ? this->ICommand::m_ppg->Plan();?

}?

執(zhí)行者接口:IGroup

IGroup.h

#ifndef Command_IGroup_h?

#define Command_IGroup_h?

class IGroup?

{?

public:?

? ? IGroup(void){}?

? ? virtual ~IGroup(void){}?

? ? virtual void Find() = 0;?

? ? virtual void Add() = 0;?

? ? virtual void Delete() = 0;?

? ? virtual void Change() = 0;?

? ? virtual void Plan() = 0;?

};?

需要組:CRequirementGroup類

CRequirementGroup.h

#ifndef __Command__RequirementGroup__?

#define __Command__RequirementGroup__?


#include ?

#include "IGroup.h"?

class CRequirementGroup:public IGroup?

{?

public:?

? ? CRequirementGroup(void);?

? ? ~CRequirementGroup(void);?

? ? void Find();?

? ? void Add();?

? ? void Delete();?

? ? void Change();?

? ? void Plan();?

};?



CRequirementGroup.cpp

#include "RequirementGroup.h"?

using std::cout;?

using std::endl;?


CRequirementGroup::CRequirementGroup(void)?

{?

}?

CRequirementGroup::~CRequirementGroup(void)?

{?

}?

void CRequirementGroup::Find()?

{?

? ? cout << "找到需求組..." << endl;?

}?

void CRequirementGroup::Add()?

{?

? ? cout << "客戶要求增加一項(xiàng)需求..." << endl;?

}?

void CRequirementGroup::Delete()?

{?

? ? cout << "要求刪除一項(xiàng)需求..." << endl;?

}?

void CRequirementGroup::Change()?

{?

? ? cout << "客戶要求修改一項(xiàng)需求..." << endl;?

}?

void CRequirementGroup::Plan()?

{?

? ? cout << "客戶要求需求變更計(jì)劃..." << endl;?

}?

美工組:CPageGroup

CPageGroup.h

#ifndef __Command__CPageGroup__?

#define __Command__CPageGroup__?


#include ?

#include "IGroup.h"?


class CPageGroup :public IGroup?

{?

public:?

? ? CPageGroup(void);?

? ? ~CPageGroup(void);?

? ? void Find();?

? ? void Add();?

? ? void Delete();?

? ? void Change();?

? ? void Plan();?

};?


CPageGroup.cpp

#include "PageGroup.h"?


using std::cout;?

using std::endl;?

CPageGroup::CPageGroup(void)?

{?

}?


CPageGroup::~CPageGroup(void)?

{?

}?


void CPageGroup::Find()?

{?

? ? cout << "找到美工組..." << endl;?

}?


void CPageGroup::Add()?

{?

? ? cout << "客戶要求增加一個(gè)頁(yè)面..." << endl;?

}?


void CPageGroup::Delete()?

{?

? ? cout << "客戶要求刪除一個(gè)頁(yè)面..." << endl;?

}?


void CPageGroup::Change()?

{?

? ? cout << "客戶要求修改一個(gè)頁(yè)面..." << endl;?

}?


void CPageGroup::Plan()?

{?

? ? cout << "客戶要求頁(yè)面變更計(jì)劃..." << endl;?

}?

代碼組:CCodePage

CCodePage.h

#ifndef __Command__CodeGroup__?

#define __Command__CodeGroup__?


#include ?

#include "IGroup.h"?


class CCodeGroup :public IGroup?

{?

public:?

? ? CCodeGroup(void);?

? ? ~CCodeGroup(void);?

? ? void Find();?

? ? void Add();?

? ? void Delete();?

? ? void Change();?

? ? void Plan();?

};?

CCodePage.cpp

#include "CodeGroup.h"?

using std::cout;?

using std::endl;?


CCodeGroup::CCodeGroup(void)?

{?

}?


CCodeGroup::~CCodeGroup(void)?

{?

}?


void CCodeGroup::Find()?

{?

? ? cout << "找到代碼組..." << endl;?

}?


void CCodeGroup::Add()?

{?

? ? cout << "客戶要求增加一項(xiàng)功能..." << endl;?

}?


void CCodeGroup::Delete()?

{?

? ? cout << "客戶要求刪除一項(xiàng)功能..." << endl;?

}?


void CCodeGroup::Change()?

{?

? ? cout << "客戶要求修改一項(xiàng)功能..." << endl;?

}?


void CCodeGroup::Plan()?

{?

? ? cout << "客戶要求代碼變更計(jì)劃..." << endl;?

}?

客戶 :main

main.cpp

#include ?

#include "IGroup.h"?

#include "ICommand.h"?

#include "RequirementGroup.h"?

#include "PageGroup.h"?

#include "CodeGroup.h"?

#include "AddRequirementCommand.h"?

#include "DeletePageCommand.h"?

#include "Invoker.h"?

using std::cout;?

using std::endl;?


void DoIt()?

{?

? ? cout << "----------客戶想增加一個(gè)需求----------" << endl;?

? ? IGroup *rg = new CRequirementGroup();?

? ? rg->Find();?

? ? rg->Add();?

? ? rg->Plan();?

? ? delete rg;?

? ? cout << endl;?


? ? cout << "----------客戶又想修改一個(gè)頁(yè)面----------" << endl;?

? ? IGroup *pg = new CPageGroup();?

? ? pg->Find();?

? ? pg->Add();?

? ? pg->Plan();?

? ? delete pg;?

? ? cout << endl;?


? ? cout << "----------客戶又想刪除一個(gè)功能----------" << endl;?

? ? IGroup *cg = new CCodeGroup();?

? ? cg->Find();?

? ? cg->Add();?

? ? cg->Plan();?

? ? delete cg;?

? ? cout << endl;?

}?


void DoNew()?

{?

? ? cout << "----------客戶覺(jué)得煩了赋续,希望只找一個(gè)人,并告訴他要做什么----------" << endl;?

? ? cout << "----------客戶要求增加一項(xiàng)需求----------" << endl;?

? ? CInvoker gary;?

? ? ICommand *pcommand = new CAddRequirementCommand();?

? ? gary.SetCommand(pcommand);?

? ? gary.Action();?

? ? delete pcommand;?

? ? cout << endl;?


? ? //客戶想要改動(dòng)只需要找CInvoker就可以了另患。?

? ? cout << "----------客戶要求刪除一個(gè)頁(yè)面----------" << endl;?

? ? CInvoker ricky;?

? ? ICommand *pcommand2 = new CDeletePageCommand();?

? ? ricky.SetCommand(pcommand2);?

? ? ricky.Action();?

? ? delete pcommand2;?

? ? cout << endl;?

}?



int main(int argc, const char * argv[])?

{?

? ? //客戶原來(lái)的運(yùn)行流程?

? ? cout<<"客戶原來(lái)的運(yùn)行流程"<

? ? DoIt();?


? ? //客戶覺(jué)得麻煩了纽乱,每次改動(dòng)都要找不同的組,談不同的事?

? ? //客戶只想找一個(gè)人昆箕,告訴他要做什么就可以鸦列,不想關(guān)心由哪幾個(gè)組來(lái)做和怎么做?

? ? cout<<"********************命令模式********************"<

? ? DoNew();?

? ? // insert code here...?

? ? std::cout << "Hello, World!\n";?

? ? return 0;?

}?

結(jié)果如下:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末租冠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子薯嗤,更是在濱河造成了極大的恐慌顽爹,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骆姐,死亡現(xiàn)場(chǎng)離奇詭異镜粤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)玻褪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門肉渴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人带射,你說(shuō)我怎么就攤上這事同规。” “怎么了庸诱?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)晤揣。 經(jīng)常有香客問(wèn)我桥爽,道長(zhǎng),這世上最難降的妖魔是什么昧识? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任钠四,我火速辦了婚禮,結(jié)果婚禮上跪楞,老公的妹妹穿的比我還像新娘缀去。我一直安慰自己,他們只是感情好甸祭,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布缕碎。 她就那樣靜靜地躺著,像睡著了一般池户。 火紅的嫁衣襯著肌膚如雪咏雌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天校焦,我揣著相機(jī)與錄音赊抖,去河邊找鬼。 笑死寨典,一個(gè)胖子當(dāng)著我的面吹牛氛雪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耸成,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼报亩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浴鸿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起捆昏,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赚楚,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后骗卜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宠页,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年寇仓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了举户。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遍烦,死狀恐怖俭嘁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情服猪,我是刑警寧澤供填,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站罢猪,受9級(jí)特大地震影響近她,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜膳帕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一粘捎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧危彩,春花似錦攒磨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至谒府,卻和暖如春漆羔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狱掂。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工演痒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趋惨。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓鸟顺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讯嫂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容