Java架構(gòu)師的修煉之路

文章開始之前我給大家分享一個java架構(gòu)交流群 群號:656039503? 每天大牛為你直播分享知識點


軟件架構(gòu)作為一個概念温眉,體現(xiàn)在技術(shù)和業(yè)務(wù)兩個方面钧舌。

從技術(shù)角度來說:軟件架構(gòu)隨著技術(shù)的革新不斷地更新其內(nèi)容慎皱,軟件架構(gòu)建立于當(dāng)前技術(shù)和一些基本原則

java高級

的基礎(chǔ)之上裸扶。?先說一些基本原則:

分層原則:分層是為了降低軟件深度復(fù)雜性而使用的關(guān)鍵思想,就像社會有了階級一樣更鲁,軟件有了層次結(jié)構(gòu)。

模塊化原則:模塊化是化解軟件廣度復(fù)雜的必然手段奇钞,模塊化的目的就是讓軟件分工澡为。

接口實現(xiàn)分離原則隨著軟件模塊化的不斷深入改進(jìn),面向接口編程而不是面向?qū)崿F(xiàn)編程可以讓復(fù)雜度日趨增高的軟件降低模塊之間的耦合度景埃,從而讓各模塊更輕松改進(jìn)媒至。從這個原則出發(fā),軟件也從微觀進(jìn)行了細(xì)致的規(guī)范化谷徙。java架構(gòu)交流群 群號:656039503 ?每天大牛為你直播分享知識點

還有兩個比較小但很重要的原則:

細(xì)節(jié)隱藏原則很顯然把復(fù)雜問題簡化拒啰,把難看的細(xì)節(jié)隱去,能讓軟件結(jié)構(gòu)更清晰完慧。其實這個原則使用很普遍谋旦,java/c++語言中的封裝原則以及設(shè)計模式中的Facade(外觀)模式就很能體現(xiàn)這個原則的精神。?依賴倒置原則隨著軟件結(jié)構(gòu)的進(jìn)一步發(fā)展,層與層之間屈尼、模塊與模塊之間的依賴逐漸加深册着,而層、模塊的動態(tài)可插拔要求不端增大脾歧。依賴倒置原則可看視為接口實現(xiàn)分離原則的深化甲捏,根據(jù)此原則的精神,軟件進(jìn)入了工具時代鞭执。這個原則有點類似于知名的好萊塢法則:Don't?call?us,?we'll?call?you司顿。

以上這些原則奠定了我們的軟件架構(gòu)的價值指標(biāo)芒粹。但軟件架構(gòu)畢竟是建立在當(dāng)前技術(shù)之上的。而每一代技術(shù)都有架構(gòu)模式大溜。過去的不再說了化漆,讓我們現(xiàn)在就來看一下當(dāng)前流行的技術(shù),以及當(dāng)前我們能采用的架構(gòu)猎提。?因為面向?qū)ο笫钱?dāng)前最流行開發(fā)技術(shù)获三,且設(shè)計模式的大量使用使面向?qū)ο蟮淖呦虺墒欤鴶?shù)據(jù)庫是當(dāng)前最有效的存儲結(jié)構(gòu)锨苏、web界面是當(dāng)前最流行的用戶接口疙教,所以當(dāng)前最典型的三層次架構(gòu)就架構(gòu)在以上幾項技術(shù)的基礎(chǔ)之上,用數(shù)據(jù)庫作存儲層伞租、用面向?qū)ο髞韺崿F(xiàn)業(yè)務(wù)層贞谓、用web來作為用戶接口層。我們從三層次架構(gòu)談起:

因為面向?qū)ο蠹夹g(shù)和數(shù)據(jù)庫技術(shù)不適配葵诈,所以在標(biāo)準(zhǔn)三層次架構(gòu)的基礎(chǔ)上裸弦,我們增加了數(shù)據(jù)持久層,來管理O-R雙向映射作喘,但目前一直沒有最理想的實現(xiàn)技術(shù)理疙。cmp和entity?bean技術(shù)因為其實現(xiàn)復(fù)雜,功能前景有限泞坦,已接近被淘汰的邊緣窖贤。JDO及hibernate作為o-r映射的后期之秀,尤其是hibernate贰锁,功能相當(dāng)完備赃梧。推薦作為持久層的首選

在業(yè)務(wù)層,因為當(dāng)前業(yè)務(wù)日趨負(fù)載,且變動頻繁豌熄,所以我們必須有足夠敏捷的技術(shù)來保證我們的適應(yīng)變化的能力授嘀,在標(biāo)準(zhǔn)j2ee系統(tǒng)中session?bean負(fù)責(zé)業(yè)務(wù)處理,且有不錯的性能表現(xiàn)锣险,但采用ejb系統(tǒng)對業(yè)務(wù)架構(gòu)模式改變太大蹄皱,且其復(fù)雜而昂貴,業(yè)務(wù)代碼移植性差芯肤。而spring?作為一個bean配置的輕量級架構(gòu)夯接,漂亮的IOC模式實現(xiàn),對業(yè)務(wù)架構(gòu)影響小纷妆,所以推薦作為中間層業(yè)務(wù)框架盔几。

在用戶結(jié)構(gòu)層,雖然servlet/jsp/jstl/javaBean?能夠?qū)崿F(xiàn)MVC架構(gòu),但終究過于粗糙。struts對MVC架構(gòu)的實現(xiàn)就比較完美掩幢,Taperstry也極好地實現(xiàn)MVC架構(gòu)逊拍,且采用基于事件的方式上鞠,非常誘人,惜其不夠成熟芯丧,我們?nèi)耘f推薦struts作為用戶接口層基礎(chǔ)架構(gòu)芍阎。

因為業(yè)務(wù)層是三層次架構(gòu)中最有決定意義的,所以讓我們回到業(yè)務(wù)層細(xì)致地分析一下缨恒,在復(fù)雜的業(yè)務(wù)我們常常需要以下基礎(chǔ)服務(wù)的一種或幾種:事務(wù)一致性服務(wù)acid(tool:jta/jts)谴咸、并發(fā)加鎖服務(wù)

concurrent&&lock、池化管理服務(wù)cache骗露、訪問控制服務(wù)(tool:jaas)岭佳、流程控制服務(wù)workflow、動態(tài)實現(xiàn)服務(wù)IOC萧锉,串行化消息服務(wù)(tool:jms)珊随、負(fù)載平衡服務(wù)blance等。如果我們不采用重量級應(yīng)用服務(wù)器(如weblogic,websphere,jboss等)及重量級組件(EJB)柿隙,我們必須自己實現(xiàn)其中一些服務(wù)叶洞。雖然我們大多情況下,不需要所有這些服務(wù)禀崖,但實現(xiàn)起來卻非易事衩辟。幸運的是我們有大量的開源實現(xiàn)代碼,但采用開源代碼卻常常是件不輕松的事。

隨著xml作為結(jié)構(gòu)化信息傳輸和存儲地位日漸重要,一些xml文檔操作工具(DOM,Digester,SAX等)的使用愈發(fā)重要,而隨著xml?schema的java?binding工具(jaxb,xmlbean等)工具的成熟波附,采用xml?schema來設(shè)計

xml文檔格式,然后采用java?binding來生成java?bean?會成為主要編程模式,而這又進(jìn)一步使數(shù)據(jù)中心向xml轉(zhuǎn)移,使在中小數(shù)據(jù)量上,愈發(fā)傾向于以xquery為查詢語言的xml數(shù)據(jù)庫惭婿。最近還有一個趨

勢,microsoft,ibm等紛紛大量開發(fā)中間軟件如(microsoft?office之infopath),可以直接從xml?schema?生成?錄入頁面等非常實用的功能叶雹。還有web?service?的廣泛應(yīng)用,都將對軟件的架構(gòu)有非常重大的影響换吧。至于面向服務(wù)架構(gòu)(SOA)前景如何折晦,三層次架構(gòu)什么時候走入歷史,現(xiàn)在還很難定論沾瓦。

aop的發(fā)展也會對軟件架構(gòu)有很深的影響满着,但在面向?qū)ο蠹軜?gòu)里,無論aspectJ還是jboss-aop抑是aspectWerks贯莺、nanning都有其自身的嚴(yán)重問題:維護(hù)性很差,所以說它將很難走遠(yuǎn)风喇。也許作為一個很好的思想,它將在web?service里大展身手缕探。

rdf,owl作為w3c語義模型的標(biāo)志性的語言,也很難想象能在當(dāng)前業(yè)務(wù)架構(gòu)發(fā)揮太大影響魂莫。但如果真如它所聲稱那樣,廣泛地改變著信息的結(jié)構(gòu)爹耗。那么對軟件架構(gòu)也會有深遠(yuǎn)影響耙考。?有關(guān)架構(gòu)設(shè)計的一些忠告:

盡量建立完整的持久對象層.可獲得高回報

盡量將各功能分層,分塊,每一模塊均依賴假定的其它模塊的外觀

不能依賴靜態(tài)數(shù)據(jù)來實現(xiàn)IOC模式谜喊,應(yīng)該依賴數(shù)據(jù)特征接口,靜態(tài)數(shù)據(jù)僅是數(shù)據(jù)特征接口實現(xiàn)方式之一?架構(gòu)設(shè)計時xml是支持而不是依賴.但可以提供單一的xml版本的實現(xiàn)

從業(yè)務(wù)角度說:軟件架構(gòu)應(yīng)是深刻體現(xiàn)業(yè)務(wù)內(nèi)部規(guī)則的業(yè)務(wù)架構(gòu)倦始,但因為業(yè)務(wù)變化頻纴斗遏,所以軟件架構(gòu)很

難保持恒定不變,但業(yè)務(wù)的頻繁變化不應(yīng)是軟件架構(gòu)大規(guī)模頻繁變化的原因鞋邑,軟件架構(gòu)應(yīng)是基于變化的架構(gòu)诵次。

一種業(yè)務(wù)有其在一段時間內(nèi)穩(wěn)定存在的理由(暫且不談),業(yè)務(wù)內(nèi)部有許多用例枚碗,每一種用例都有固定的規(guī)則逾一,每一規(guī)則都有一些可供判定的項,每一項從某一維度來觀察都是可測量的视译,我們的架構(gòu)首先必須保證完美適應(yīng)每一項每一種測量方式嬉荆,很多失敗的架構(gòu)都是因為很多項的測量方式都發(fā)生變更這種微觀變化中。?每個用例都有規(guī)則酷含,我們在作業(yè)務(wù)用例分析鄙早,常常假定一些規(guī)則是先驗的,持久穩(wěn)定的椅亚,然而后來的業(yè)務(wù)改變常常又證明這種看法是錯誤的限番,然而常常我們的架構(gòu)已經(jīng)為之付出了不可挽回的代價。大量事實證明:規(guī)則的變化常常用例變化的根本原因呀舔。所以我們的架構(gòu)要盡可能適應(yīng)規(guī)則的變化弥虐,盡可能建立規(guī)則模版。?每個用例都關(guān)系著不同的角色媚赖。每一個用例的產(chǎn)生都必然是因為角色的變更(注意:不是替換霜瘪,而是增強(qiáng)或減弱),所以注意角色的各種可能情況惧磺,對架構(gòu)的設(shè)計有舉足輕重的意義颖对。在我們當(dāng)前的三層架構(gòu)里,角色完美地對應(yīng)接口概念磨隘。

在一個系統(tǒng)里很多用例都相互關(guān)聯(lián),考慮到每個用例均有可能有不同的特例缤底,所以在架構(gòu)設(shè)計中,盡量采用依賴倒置原則番捂。如架構(gòu)許可可采用消息通信模式(JMS)个唧。這樣可降低耦合度。

現(xiàn)在我們談一下業(yè)務(wù)穩(wěn)定存在理由對業(yè)務(wù)的影響设预。存在即是合理徙歼,在這里當(dāng)然是正確的。業(yè)務(wù)因人而存在,所以問業(yè)務(wù)存在的理由即是問不同角色的需要這項業(yè)務(wù)的理由以及喜歡不喜歡當(dāng)前業(yè)務(wù)用例的理由鲁沥,所有這樣的角色都應(yīng)該在系統(tǒng)里預(yù)留呼股。《待續(xù)》?在架構(gòu)設(shè)計中有幾個原則可以考慮:?用例盡量細(xì)分?用例盡量抽象?角色盡量獨立?項測量獨立原則?追求簡單性

這里未提供相關(guān)的例子画恰,例子會在以后的更新時提供彭谁。

業(yè)務(wù)和模式之間的關(guān)系

業(yè)務(wù)中的一些用例之間的關(guān)系常常和一些常規(guī)的模式很相似。但隨著時間的演化允扇,慢慢地和先前的模式有了分歧缠局。這是個正常的現(xiàn)象。但這對系統(tǒng)架構(gòu)卻要求非常高考润,要求系統(tǒng)架構(gòu)能適應(yīng)一些模式的更替狭园。在這里我們盡可能早地注意到用例之間的相互角色變化,為架構(gòu)更新做好準(zhǔn)備.

企業(yè)應(yīng)用架構(gòu)模式

《敏捷軟件開發(fā)原則糊治、模式與實踐》?《UML精粹》?《快速軟件開發(fā)》?一唱矛、Java編程入門類

對于沒有Java編程經(jīng)驗的程序員要入門,隨便讀什么入門書籍都一樣井辜,這個階段需要你快速的掌握J(rèn)ava基礎(chǔ)語法和基本用法绎谦,宗旨就是“囫圇吞棗不求甚解”,先對Java熟悉起來再說粥脚。用很短的時間快速過一遍Java語法窃肠,連懵帶猜多寫寫代碼,要“知其然”刷允。??1冤留、《Java編程思想》

在有了一定的Java編程經(jīng)驗之后,你需要“知其所以然”了树灶。這個時候《Java編程思想》是一本讓你知其所以然的好書纤怒,它對于基本的面向?qū)ο笾R有比較清楚的交待,對Java基本語法天通,基本類庫有比較清楚的講解泊窘,可以幫你打一個良好的Java編程基礎(chǔ)。這本書的缺點是實在太厚土砂,也比較羅嗦,不適合現(xiàn)代人快節(jié)奏學(xué)習(xí)谜洽,因此看這本書要懂得取舍萝映,不是每章每節(jié)都值得一看的,挑重點的深入看就可以了阐虚。??2序臂、《Agile?Java》中文版

這本書是出版社送給我的,我一拿到就束之高閣,放在書柜一頁都沒有翻過奥秆,但是前兩天整理書柜的時候逊彭,拿出來一翻,竟然發(fā)現(xiàn)這絕對是一本好書构订!這本書一大特點是以單元測試和TDD來貫穿全書的侮叮,在教你Java各種重要的基礎(chǔ)知識的過程中,潛移默化的影響你的編程思維走向敏捷悼瘾,走向TDD囊榜。另外這本書成書很新,以JDK5.0的語法為基礎(chǔ)講解亥宿,要學(xué)習(xí)JDK5.0的新語法也不錯卸勺。還有這本書對于內(nèi)容取舍也非常得當(dāng),Java語言畢竟類庫龐大烫扼,可以講的內(nèi)容太多曙求,這本書選擇的內(nèi)容以及內(nèi)容的多寡都很得當(dāng),可以讓你以最少的時間掌握J(rèn)ava最重要的知識映企,順便培養(yǎng)出來優(yōu)秀的編程思路悟狱,真是一本不可多得的好書。

雖然作者自己把這本書定位在入門級別卑吭,但我不確定這本書用來入門是不是稍微深了點芽淡,我自己也準(zhǔn)備有空的時候翻翻這本書,學(xué)習(xí)學(xué)習(xí)豆赏。

二挣菲、Java編程進(jìn)階類

打下一個良好的Java基礎(chǔ),還需要更多的實踐經(jīng)驗積累掷邦,我想沒有什么捷徑白胀。有兩本書值

得你在編程生涯的這個階段閱讀,培養(yǎng)良好的編程習(xí)慣抚岗,提高你的代碼質(zhì)量或杠。??1、《重構(gòu)?改善既有代碼的設(shè)計》

這本書名氣很大宣蔚,不用多介紹向抢,可以在閑暇的時候多翻翻,多和自己的實踐相互印證胚委。這本書對你產(chǎn)生影響是潛移默化的挟鸠。

2、《測試驅(qū)動開發(fā)?by?Example》?本書最大特點是很薄亩冬,看起來沒有什么負(fù)擔(dān)艘希。你可以找一個周末的下午,一邊看,一邊照做覆享,一個下午就把書看完佳遂,這本書的所有例子跑完了。這本書的作用是通過實戰(zhàn)讓你培養(yǎng)TDD的思路撒顿。

三丑罪、Java架構(gòu)師之路

到這個階段,你應(yīng)該已經(jīng)非常嫻熟的運用Java編程核蘸,而且有了一個良好的編程思路和習(xí)慣了巍糯,但是你可能還缺乏對應(yīng)用軟件整體架構(gòu)的把握,現(xiàn)在就是你邁向架構(gòu)師的第一步客扎。

1祟峦、《Expert?One-on-One?J2EE?Design?and?Development》

這本書是Rod?Johnson的成名著作,非常經(jīng)典徙鱼,從這本書中的代碼誕生了springframework宅楞。但是好像這本書沒有中譯本。

2袱吆、《Expert?One-on-One?J2EE?Development?without?EJB》

這本書由gigix組織翻譯厌衙,多位業(yè)界專家參與,雖然署名譯者是JavaEye绞绒,其實JavaEye出力不多婶希,實在是忝居譯者之名。

以上兩本書都是Rod?Johnson的經(jīng)典名著蓬衡,Java架構(gòu)師的必讀書籍喻杈。在我所推薦的這些書籍當(dāng)中,是我看過的最仔細(xì)狰晚,最認(rèn)真的書筒饰,我當(dāng)時讀這本書幾乎是廢寢忘食的一氣讀完的,有小時候挑燈夜讀金庸武俠小說的勁頭壁晒,書中所講內(nèi)容和自己的經(jīng)驗知識一一印證瓷们,又被無比精辟的總結(jié)出來,讀完這本書以后秒咐,我有種被打通經(jīng)脈谬晕,功力爆增的感覺。

但是后來我看過一些其他人的評價携取,似乎閱讀體驗并沒有我那么high攒钳,也許是因為每個人的知識積累和經(jīng)驗不同導(dǎo)致的。我那個時候剛好是經(jīng)驗知識積累已經(jīng)足夠豐富歹茶,但是還沒有系統(tǒng)的整理成型夕玩,讓這本書一梳理,立刻形成完整的知識體系了惊豺。

3燎孟、《企業(yè)應(yīng)用架構(gòu)模式》

Martin的又一本名著,但這本書我只是泛泛的看了一遍尸昧,并沒有仔細(xì)看揩页。這本書似乎更適合做框架的人去看,例如如果你打算自己寫一個ORM的話烹俗,這本書是一定要看的爆侣。但是做應(yīng)用的人,不看貌似也無所謂幢妄,但是如果有空兔仰,我還是推薦認(rèn)真看看,會讓你知道框架為什么要這樣設(shè)計蕉鸳,這樣你的層次可以晉升到框架設(shè)計者的角度去思考問題乎赴。Martin的書我向來都是推崇,但是從來都沒有像Rod?Johnson的書那樣非常認(rèn)真去看潮尝。

4榕吼、《敏捷軟件開發(fā)原則、模式與實踐》

Uncle?Bob的名著勉失,敏捷的經(jīng)典名著羹蚣,這本書比較特別,與其說是講軟件開發(fā)過程的書乱凿,不如說講軟件架構(gòu)的書顽素,本書用了很大篇幅講各種面向?qū)ο筌浖_發(fā)的各種模式,個人以為看了這本書告匠,就不必看GoF的《設(shè)計模式》了戈抄。

四、

軟件開發(fā)過程了解軟件開發(fā)過程不單純是提高程序員個人的良好編程習(xí)慣后专,也是增強(qiáng)團(tuán)隊協(xié)作的基礎(chǔ)?

如何更好的學(xué)習(xí)架構(gòu)歡迎大家加群交流:656039503【JAVA大神學(xué)習(xí)交流】里面有Java高級大牛直播講解知識點 走的就是高端路線

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末划鸽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子戚哎,更是在濱河造成了極大的恐慌裸诽,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件型凳,死亡現(xiàn)場離奇詭異丈冬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)甘畅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門埂蕊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來往弓,“玉大人,你說我怎么就攤上這事蓄氧『疲” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵喉童,是天一觀的道長撇寞。 經(jīng)常有香客問我,道長堂氯,這世上最難降的妖魔是什么蔑担? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮咽白,結(jié)果婚禮上啤握,老公的妹妹穿的比我還像新娘。我一直安慰自己晶框,他們只是感情好恨统,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著三妈,像睡著了一般畜埋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畴蒲,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天悠鞍,我揣著相機(jī)與錄音,去河邊找鬼模燥。 笑死咖祭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蔫骂。 我是一名探鬼主播么翰,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辽旋!你這毒婦竟也來了浩嫌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤补胚,失蹤者是張志新(化名)和其女友劉穎码耐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溶其,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡骚腥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓶逃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片束铭。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡廓块,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出契沫,到底是詐尸還是另有隱情剿骨,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布埠褪,位于F島的核電站,受9級特大地震影響挤庇,放射性物質(zhì)發(fā)生泄漏钞速。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一嫡秕、第九天 我趴在偏房一處隱蔽的房頂上張望渴语。 院中可真熱鬧,春花似錦昆咽、人聲如沸驾凶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽调违。三九已至,卻和暖如春泻轰,著一層夾襖步出監(jiān)牢的瞬間技肩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工浮声, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留虚婿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓泳挥,卻偏偏與公主長得像然痊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屉符,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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