11.享元模式Flyweight

1.初識(shí)享元模式

運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。

  • Flyweight:
    享元接口,通過這個(gè)接口flyweight可以接受并作用于外部狀態(tài)。通過這個(gè)接口傳入外部的狀態(tài),在享元對(duì)象的方法處理中可能會(huì)使用這些外部的數(shù)據(jù)。
  • ConcreteFlyweight:
    具體的享元實(shí)現(xiàn)對(duì)象,必須是可共享的,需要封裝flyweight的內(nèi)部狀態(tài)。
  • UnsharedConcreteFlyweight:
    非共享的享元實(shí)現(xiàn)對(duì)象,并不是所有的Flyweight實(shí)現(xiàn)對(duì)象都需要共享。非共享的享元實(shí)現(xiàn)對(duì)象通常是對(duì)共享享元對(duì)象的組合對(duì)象。
  • FlyweightFactory:
    享元工廠,主要用來創(chuàng)建并管理共享的享元對(duì)象,并對(duì)外提供訪問共享享元的接口。
  • Client:
    享元客戶端,主要的工作是維持一個(gè)對(duì)flyweight的引用,計(jì)算或存儲(chǔ)享元對(duì)象的外部狀態(tài),當(dāng)然這里可以訪問共享和不共享的flyweight對(duì)象。

2.體會(huì)享元模式

使用享元模式解決權(quán)限控制問題。

2.1 權(quán)限控制

對(duì)于應(yīng)用系統(tǒng)而言,一般先要登錄系統(tǒng),才可以使用系統(tǒng)的功能,登錄過后,用戶的每次操作都需要經(jīng)過權(quán)限系統(tǒng)的控制,確保該用戶有操作該功能的權(quán)限,同時(shí)還要控制該用戶對(duì)數(shù)據(jù)的訪問權(quán)限、修改權(quán)限等等。總之一句話,一個(gè)安全的系統(tǒng),需要對(duì)用戶的每一次操作都要做權(quán)限檢測(cè),包括功能和數(shù)據(jù),以確保只有獲得相應(yīng)授權(quán)的人,才能執(zhí)行相應(yīng)的功能,操作相應(yīng)的數(shù)據(jù)。

舉個(gè)例子來說吧:普通人員都有能查看到本部門人員列表的權(quán)限,但是在人員列表中每個(gè)人員的薪資數(shù)據(jù),普通人員是不可以看到的;而部門經(jīng)理在查看本部門人員列表的時(shí)候,就可以看到每個(gè)人員相應(yīng)的薪資數(shù)據(jù)。
現(xiàn)在就要來實(shí)現(xiàn)為系統(tǒng)加入權(quán)限控制的功能,該怎么實(shí)現(xiàn)呢?

2.1.1 權(quán)限管理的基礎(chǔ)知識(shí)

幾乎所有的權(quán)限系統(tǒng)都分成兩個(gè)部分,一個(gè)是授權(quán)部分,一個(gè)是驗(yàn)證部分,
為了理解它們,首先解釋兩個(gè)基本的名詞:安全實(shí)體和權(quán)限。

  • 1)安全實(shí)體:就是被權(quán)限系統(tǒng)檢測(cè)的對(duì)象,比如工資數(shù)據(jù)。
  • 2)權(quán)限:就是需要被校驗(yàn)的權(quán)限對(duì)象,比如查看、修改等。

安全實(shí)體和權(quán)限通常要一起描述才有意義,比如有這么個(gè)描述:“現(xiàn)在要檢測(cè)登錄人員對(duì)工資數(shù)據(jù)是否有查看的權(quán)限”, “工資數(shù)據(jù)”這個(gè)安全實(shí)體和“查看”這個(gè)權(quán)限一定要一起描述。如果只出現(xiàn)安全實(shí)體描述,那就變成這樣:“現(xiàn)在要檢測(cè)登錄人員對(duì)工資數(shù)據(jù)”,對(duì)工資數(shù)據(jù)干什么呀,沒有后半截,一看就知道不完整;當(dāng)然只有權(quán)限描述也不行,那就變成:“現(xiàn)在要檢測(cè)登錄人員是否有查看的權(quán)限”,對(duì)誰的查看權(quán)限啊,也不完整。所以安全實(shí)體和權(quán)限通常要一起描述。

  • 所謂授權(quán)是指:把對(duì)某些安全實(shí)體的某些權(quán)限分配給某些人員的過程。
  • 所謂驗(yàn)證是指:判斷某個(gè)人員對(duì)某個(gè)安全實(shí)體是否擁有某個(gè)或某些權(quán)限的過程。

也就是說,授權(quán)過程即是權(quán)限的分配過程,而驗(yàn)證過程則是權(quán)限的匹配過程。在目前應(yīng)用系統(tǒng)的開發(fā)中,多數(shù)是利用數(shù)據(jù)庫來存放授權(quán)過程產(chǎn)生的數(shù)據(jù),也就是說:授權(quán)是向數(shù)據(jù)庫里面添加數(shù)據(jù)、或是維護(hù)數(shù)據(jù)的過程,而匹配過程就變成了從數(shù)據(jù)庫中獲取相應(yīng)數(shù)據(jù)進(jìn)行匹配的過程了。為了讓問題相對(duì)簡(jiǎn)化一點(diǎn),就不去考慮權(quán)限的另外兩個(gè)特征,一個(gè)是繼承性,一個(gè)是最近匹配原則,都什么意思呢?

  • 權(quán)限的繼承性
    指的是:如果多個(gè)安全實(shí)體存在包含關(guān)系,而某個(gè)安全實(shí)體沒有相應(yīng)的權(quán)限限制,那么它會(huì)繼承包含它的安全實(shí)體的相應(yīng)權(quán)限。

  • 權(quán)限的最近匹配原則
    指的是:如果多個(gè)安全實(shí)體存在包含關(guān)系,而某個(gè)安全實(shí)體沒有相應(yīng)的權(quán)限限制,那么它會(huì)向上尋找并匹配相應(yīng)權(quán)限限制,直到找到一個(gè)離這個(gè)安全實(shí)體最近的擁有相應(yīng)權(quán)限限制的安全實(shí)體為止。如果把整個(gè)層次結(jié)構(gòu)都尋找完了都沒有匹配到相應(yīng)權(quán)限限制的話,那就說明所有人對(duì)這個(gè)安全實(shí)體都擁有這個(gè)相應(yīng)的權(quán)限限制。

可通過小區(qū)的權(quán)限實(shí)例來理解:小區(qū)->大樓->房間。

2.2 不用模式的解決方案

不用模式的解決方案example1
由于操作人員進(jìn)行授權(quán)操作過后,各人員被授予的權(quán)限是記錄在數(shù)據(jù)庫中的,剛開始有開發(fā)人員提出,每次用戶操作系統(tǒng)的時(shí)候,都直接到數(shù)據(jù)庫里面去動(dòng)態(tài)查詢,以判斷該人員是否擁有相應(yīng)的權(quán)限,但很快就被否決掉了,試想一下,用戶操作那么頻繁,每次都到數(shù)據(jù)庫里面動(dòng)態(tài)查詢,這會(huì)嚴(yán)重加劇數(shù)據(jù)庫服務(wù)器的負(fù)擔(dān),使系統(tǒng)變慢。

為了加快系統(tǒng)運(yùn)行的速度,開發(fā)小組決定采用一定的緩存,當(dāng)每個(gè)人員登錄的時(shí)候,就把該人員能操作的權(quán)限獲取到,存儲(chǔ)在內(nèi)存中,這樣每次操作的時(shí)候,就直接在內(nèi)存里面進(jìn)行權(quán)限的校驗(yàn),速度會(huì)大大加快,這是典型的以空間換時(shí)間的做法。

2.2.1 有何問題

看了上面的實(shí)現(xiàn),很簡(jiǎn)單,而且還考慮了性能的問題,在內(nèi)存中緩存了每個(gè)人相應(yīng)的權(quán)限數(shù)據(jù),使得每次判斷權(quán)限的時(shí)候,速度大大加快,實(shí)現(xiàn)得挺不錯(cuò),難道有什么問題嗎?

2.2.1.1 緩存固有問題

仔細(xì)想想,問題就來了,既有緩存這種方式固有的問題,也有我們實(shí)現(xiàn)上的問題。先說說緩存固有的問題吧,這個(gè)不在本次討論之列。

  • 1)緩存時(shí)間長(zhǎng)度的問題
  • 2)緩存數(shù)據(jù)和真實(shí)數(shù)據(jù)的同步問題
  • 3)緩存的多線程并發(fā)控制

2.2.1.2 存在大量有重復(fù)數(shù)據(jù)的細(xì)粒度對(duì)象

仔細(xì)看看上面輸出結(jié)果,輸出的值是不同的,表明這些對(duì)象實(shí)例肯定不是同一個(gè)對(duì)象實(shí)例,而是多個(gè)對(duì)象實(shí)例。這就引出一個(gè)問題了,就是對(duì)象實(shí)例數(shù)目太多。

另外,這些對(duì)象的粒度都很小,都是簡(jiǎn)單的描述某一個(gè)方面的對(duì)象,而且很多數(shù)據(jù)是重復(fù)的,在這些大量重復(fù)的數(shù)據(jù)上耗費(fèi)掉了很多的內(nèi)存。比如在前面示例的數(shù)據(jù)中就會(huì)發(fā)現(xiàn)有重復(fù)的部分,見下面框住的部分:


前面講過,對(duì)于安全實(shí)體和權(quán)限一般要聯(lián)合描述,因此對(duì)于“人員列表這個(gè)安全實(shí)體的查看權(quán)限限制”,就算是授權(quán)給不同的人員,這個(gè)描述是一樣的。假設(shè)在某極端情況下,要把“人員列表這個(gè)安全實(shí)體的查看權(quán)限限制”授權(quán)給一萬個(gè)人,那么數(shù)據(jù)庫里面會(huì)有一萬條記錄,按照前面的實(shí)現(xiàn)方式,會(huì)有一萬個(gè)對(duì)象實(shí)例,而這些實(shí)例里面,有大部分的數(shù)據(jù)是重復(fù)的,而且會(huì)重復(fù)一萬次,你覺得這是不是個(gè)很大的問題呢?

把上面的問題描述出來就是:在系統(tǒng)當(dāng)中,存在大量的細(xì)粒度對(duì)象,而且存在大量的重復(fù)數(shù)據(jù),嚴(yán)重耗費(fèi)內(nèi)存,如何解決?

2.3 使用模式的解決方案

使用模式的解決方案example2
現(xiàn)在造成內(nèi)存浪費(fèi)的主要原因:就是細(xì)粒度對(duì)象太多,而且有大量重復(fù)的數(shù)據(jù)。如果能夠有效的減少對(duì)象的數(shù)量,減少重復(fù)的數(shù)據(jù),那么就能夠節(jié)省不少內(nèi)存。一個(gè)基本的思路就是緩存這些包含著重復(fù)數(shù)據(jù)的對(duì)象,讓這些對(duì)象只出現(xiàn)一次,也就只耗費(fèi)一份內(nèi)存了。

但是請(qǐng)注意,并不是所有的對(duì)象都適合緩存,因?yàn)榫彺娴氖菍?duì)象的實(shí)例,實(shí)例里面存放的主要是對(duì)象屬性的值。因此,如果被緩存的對(duì)象的屬性值經(jīng)常變動(dòng),那就不適合緩存了,因?yàn)檎鎸?shí)對(duì)象的屬性值變化了,那么緩存里面的對(duì)象也必須要跟著變化,否則緩存中的數(shù)據(jù)就跟真實(shí)對(duì)象的數(shù)據(jù)不同步,可以說是錯(cuò)誤的數(shù)據(jù)了。

因此,需要分離出被緩存對(duì)象實(shí)例中,哪些數(shù)據(jù)是不變且重復(fù)出現(xiàn)的,哪些數(shù)據(jù)是經(jīng)常變化的,真正應(yīng)該被緩存的數(shù)據(jù)是那些不變且重復(fù)出現(xiàn)的數(shù)據(jù),把它們稱為對(duì)象的內(nèi)部狀態(tài),而那些變化的數(shù)據(jù)就不緩存了,把它們稱為對(duì)象的外部狀態(tài)。

這樣在實(shí)現(xiàn)的時(shí)候,把內(nèi)部狀態(tài)分離出來共享,稱之為享元,通過共享享元對(duì)象來減少對(duì)內(nèi)存的占用。把外部狀態(tài)分離出來,放到外部,讓應(yīng)用在使用的時(shí)候進(jìn)行維護(hù),并在需要的時(shí)候傳遞給享元對(duì)象使用。為了控制對(duì)內(nèi)部狀態(tài)的共享,并且讓外部能簡(jiǎn)單的使用共享數(shù)據(jù),提供一個(gè)工廠來管理享元,把它稱為享元工廠。



很明顯,可以把安全實(shí)體和權(quán)限的描述定義成為享元,而和它們結(jié)合的人員數(shù)據(jù),就可以做為享元的外部數(shù)據(jù)。

3.理解享元模式

3.1 認(rèn)識(shí)享元模式

3.1.1 變與不變

享元模式設(shè)計(jì)的重點(diǎn)就在于分離變與不變,把一個(gè)對(duì)象的狀態(tài)分成內(nèi)部狀態(tài)和外部狀態(tài),內(nèi)部狀態(tài)是不變的,外部狀態(tài)是可變的。然后通過共享不變的部分,達(dá)到減少對(duì)象數(shù)量、并節(jié)約內(nèi)存的目的。在享元對(duì)象需要的時(shí)候,可以從外部傳入外部狀態(tài)給共享的對(duì)象,共享對(duì)象會(huì)在功能處理的時(shí)候,使用自己內(nèi)部的狀態(tài)和這些外部的狀態(tài)。

3.1.2 共享與不共享

在享元模式中,享元對(duì)象又有共享與不共享之分,這種情況通常出現(xiàn)在跟組合模式合用的情況,通常共享的是葉子對(duì)象,一般不共享的部分是由共享部分組合而成的,由于所有細(xì)粒度的葉子對(duì)象都已經(jīng)緩存了,那么緩存組合對(duì)象就沒有什么意義了。

3.1.3 內(nèi)部狀態(tài)和外部狀態(tài)

享元模式的內(nèi)部狀態(tài),通常指的是包含在享元對(duì)象內(nèi)部的、對(duì)象本身的狀態(tài),通常是獨(dú)立于使用享元的場(chǎng)景的信息,一般創(chuàng)建過后就不再變化的狀態(tài),因此可以共享。

外部狀態(tài)指的是享元對(duì)象之外的狀態(tài),取決于使用享元的場(chǎng)景,會(huì)根據(jù)使用場(chǎng)景而變化,因此不可共享。如果享元對(duì)象需要這些外部狀態(tài)的話,可以從外部傳遞到享元對(duì)象里面,比如通過方法的參數(shù)來傳遞。
也就是說享元模式真正緩存和共享的數(shù)據(jù)是享元的內(nèi)部狀態(tài),而外部狀態(tài)是不應(yīng)該被緩存共享的。

另外一點(diǎn),內(nèi)部狀態(tài)和外部狀態(tài)是獨(dú)立的,外部狀態(tài)的變化不應(yīng)該影響到內(nèi)部狀態(tài)。

3.1.4 實(shí)例池

在享元模式中,為了創(chuàng)建和管理共享的享元部分,引入了享元工廠,享元工廠中一般都包含有享元對(duì)象的實(shí)例池,享元對(duì)象就是緩存在這個(gè)實(shí)例池中的。

簡(jiǎn)單介紹一點(diǎn)實(shí)例池的知識(shí),所謂實(shí)例池,指的是緩存和管理對(duì)象實(shí)例的程序,通常實(shí)例池會(huì)提供對(duì)象實(shí)例的運(yùn)行環(huán)境,并控制對(duì)象實(shí)例的生命周期。
工業(yè)級(jí)的實(shí)例池實(shí)現(xiàn)上有兩個(gè)最基本的難點(diǎn),一個(gè)就是動(dòng)態(tài)控制實(shí)例數(shù)量,一個(gè)就是動(dòng)態(tài)分配實(shí)例來提供給外部使用。這些都是需要算法來做保證的。

回到享元模式中來,享元工廠中的實(shí)例池可沒有這么復(fù)雜,因?yàn)楣蚕淼南碓獙?duì)象基本上都是一個(gè)實(shí)例,一般不會(huì)出現(xiàn)同一個(gè)享元對(duì)象有多個(gè)實(shí)例的情況,這樣就不用去考慮動(dòng)態(tài)創(chuàng)建和銷毀享元對(duì)象實(shí)例的功能;另外只有一個(gè)實(shí)例,也就不存在動(dòng)態(tài)調(diào)度的麻煩。
這也主要是因?yàn)橄碓獙?duì)象封裝的多半是對(duì)象的內(nèi)部狀態(tài),這些狀態(tài)通常是不變的,有一個(gè)實(shí)例就夠了,不需要?jiǎng)討B(tài)控制生命周期,也不需要?jiǎng)討B(tài)調(diào)度,它只需要做一個(gè)緩存而已,沒有上升到真正的實(shí)例池那么個(gè)高度。

3.1.5 享元模式的調(diào)用順序示意圖

享元模式的使用上,有兩種情況,一種是沒有“不需要共享”的享元對(duì)
象,就如同前面的示例那樣,只有共享享元對(duì)象的情況;還有一種是既有共享享元對(duì)象,又有不需要共享的享元對(duì)象的情況。
這里看看只有共享享元對(duì)象的情況下,享元模式的調(diào)用順序:


3.1.6 誰來初始化共享對(duì)象

在享元模式中,通常是在第一次向享元工廠請(qǐng)求獲取共享對(duì)象的時(shí)候,進(jìn)行共享對(duì)象的初始化,而且多半都是在享元工廠內(nèi)部實(shí)現(xiàn),不會(huì)從外部傳入共享對(duì)象。當(dāng)然可以從外部傳入一些創(chuàng)建共享對(duì)象需要的值,享元工廠可以按照這些值去初始化需要共享的對(duì)象,然后就把創(chuàng)建好的共享對(duì)象的實(shí)例放入享元工廠內(nèi)部的緩存中,以后再請(qǐng)求這個(gè)共享對(duì)象的時(shí)候就不用再創(chuàng)建了。

3.2 不需要共享的享元實(shí)現(xiàn)

共享example3
在實(shí)際開發(fā)中,存在不需要共享的享元實(shí)現(xiàn),這種情況多出現(xiàn)在組合結(jié)構(gòu)中,對(duì)于使用已經(jīng)緩存的享元組合出來的對(duì)象,就沒有必要再緩存了,也就是把已經(jīng)緩存的享元當(dāng)做葉子結(jié)點(diǎn),組合出來的組合對(duì)象就不需要再被緩存了。也把這種享元稱為復(fù)合享元。

比如要給某人分配“薪資數(shù)據(jù)”這個(gè)安全實(shí)體的“修改”權(quán)限,那么一定會(huì)把“薪資數(shù)據(jù)”的“查看權(quán)限”也分配給這個(gè)人,如果按照前面的做法,這就需要分配兩個(gè)對(duì)象,為了方便,干脆把這兩個(gè)描述組合起來,打包成一個(gè)對(duì)象,命名成為“操作薪資數(shù)據(jù)”,那么分配權(quán)限的時(shí)候,可以這么描述:

把“操作薪資數(shù)據(jù)” 分配給張三

這句話的意思就相當(dāng)于

把“薪資數(shù)據(jù)” 的“查看”權(quán)限分配給張三
把“薪資數(shù)據(jù)” 的“修改”權(quán)限分配給張三

這樣一來,“操作薪資數(shù)據(jù)”就相當(dāng)于是一個(gè)不需要共享的享元,它實(shí)際由享元“薪資數(shù)據(jù)的查看權(quán)限”,和享元“薪資數(shù)據(jù)的修改權(quán)限”這兩個(gè)享元組合而成,因此“操作薪資數(shù)據(jù)”本身也就不需要再共享了。

3.3 對(duì)享元對(duì)象的管理

對(duì)享元對(duì)象的管理example4
雖然享元模式對(duì)于共享的享元對(duì)象實(shí)例的管理要求,沒有實(shí)例池對(duì)實(shí)例管理的要求那么高,但是也還是有很多自身的特點(diǎn)功能,比如:引用計(jì)數(shù)、垃圾清除等。
所謂引用計(jì)數(shù),就是享元工廠能夠記錄每個(gè)享元被使用的次數(shù);所謂垃圾,就是在緩存中存在,但是不再需要被使用的緩存中的對(duì)象。而垃圾清除,就是在不需要這些數(shù)據(jù)的時(shí)候,應(yīng)該把這些數(shù)據(jù)從緩存中清除,釋放相應(yīng)的內(nèi)存空間,以節(jié)省資源。

在前面的示例中,共享的享元對(duì)象是很多人共享的,基本上可以一直存在于系統(tǒng)中,不用清除。但是垃圾清除是享元對(duì)象管理的一個(gè)很常見功能。

3.3.1 實(shí)現(xiàn)引用計(jì)數(shù)的基本思路

要實(shí)現(xiàn)引用計(jì)數(shù),就在享元工廠里面定義一個(gè)Map,它的key值跟緩存享元對(duì)象的key是一樣的,而value就是被引用的次數(shù),這樣當(dāng)外部每次獲取該享元的時(shí)候,就把對(duì)應(yīng)的引用計(jì)數(shù)取出來加上1,然后再記錄回去。

3.3.2 實(shí)現(xiàn)垃圾回收的基本思路

要實(shí)現(xiàn)垃圾回收就比較麻煩點(diǎn),首先要能確定哪些是垃圾?其次是何時(shí)回收?還有由誰來回收?如何回收?解決了這些問題,也就能實(shí)現(xiàn)垃圾回收了。

確定哪些是垃圾的一個(gè)簡(jiǎn)單方案是這樣的,定義一個(gè)緩存對(duì)象的配置對(duì)象,在這個(gè)對(duì)象中描述了緩存的開始時(shí)間和最長(zhǎng)不被使用的時(shí)間,這個(gè)時(shí)候判斷是垃圾的計(jì)算公式如下:

當(dāng)前的時(shí)間- 緩存的開始時(shí)間>= 最長(zhǎng)不被使用的時(shí)間。

當(dāng)然,每次這個(gè)對(duì)象被使用的時(shí)候,就把那個(gè)緩存開始的時(shí)間更新為使用時(shí)的當(dāng)前時(shí)間,也就是說如果一直有人用的話,這個(gè)對(duì)象是不會(huì)被判斷為垃圾的。

何時(shí)回收的問題,當(dāng)然是判斷出來是垃圾了就可以回收了。
關(guān)鍵是誰來判斷垃圾,還有誰來回收垃圾的問題。一個(gè)簡(jiǎn)單的方案是定義一個(gè)內(nèi)部的線程,這個(gè)線程在享元工廠被創(chuàng)建的時(shí)候就啟動(dòng)運(yùn)行。由這個(gè)線程每隔一定的時(shí)間來循環(huán)緩存中所有對(duì)象的緩存配置,看看是否是垃圾,如果是垃圾,那就可以啟動(dòng)回收了。

怎么回收呢?這個(gè)簡(jiǎn)單,就是直接從緩存的map對(duì)象中刪除掉相應(yīng)的對(duì)象,讓這些對(duì)象沒有引用的地方,那么這些對(duì)象就可以等著被虛擬機(jī)的垃圾回收來回收掉了。

3.4 享元模式的優(yōu)缺點(diǎn)

  • 1)減少對(duì)象數(shù)量,節(jié)省內(nèi)存空間
  • 2)維護(hù)共享對(duì)象,需要額外開銷

4.思考享元模式

4.1 享元模式的本質(zhì)

享元模式的本質(zhì)是:分離與共享

4.2 何時(shí)選用

  • 1)如果一個(gè)應(yīng)用程序使用了大量的細(xì)粒度對(duì)象,可以使用享元模式來減少對(duì)象數(shù)量
  • 2)如果由于使用大量的對(duì)象,造成很大的存儲(chǔ)開銷,可以使用享元模式來減少對(duì)象數(shù)量,并節(jié)約內(nèi)存
  • 3)如果對(duì)象的大多數(shù)狀態(tài)都可以轉(zhuǎn)變?yōu)橥獠繝顟B(tài),比如通過計(jì)算得到,或是從外部傳入等,可以使用享元模式來實(shí)現(xiàn)內(nèi)部狀態(tài)和外部狀態(tài)的分離
  • 4)如果不考慮對(duì)象的外部狀態(tài),可以用相對(duì)較少的共享對(duì)象取代很多組合對(duì)象,可以使用享元模式來共享對(duì)象,然后組合對(duì)象來使用這些共享對(duì)象

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,694評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,690評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,019評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,188評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,718評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,438評(píng)論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,667評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,845評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評(píng)論 1 295
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,384評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評(píng)論 2 380

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