設(shè)計(jì)模式總結(jié)

一、創(chuàng)建型模式(Creational Patterns)

1. 工廠方法(Factory Method)
1.1 意圖(Intent):

Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
定義一個(gè)用于創(chuàng)建對(duì)象的接口,但是讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。工廠方法使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)。

  • 工廠方法中的角色:
    Product:抽象產(chǎn)品
    ConcreteProduct:具體產(chǎn)品
    Factory:抽象工廠
    ConcreteFactory:具體工廠
1.2 適用場(chǎng)景:

(1)如果無(wú)法預(yù)知對(duì)象的確切類(lèi)別及其依賴(lài)關(guān)系時(shí),可以考慮使用工廠方法;
工廠方法將創(chuàng)建產(chǎn)品的代碼與實(shí)際使用產(chǎn)品的代碼分離,從而能在不影響其他代碼的情況下,擴(kuò)展創(chuàng)建產(chǎn)品部分的代碼;
(2)如果你希望用戶能擴(kuò)展你的軟件庫(kù)或框架的內(nèi)部組件,可使用工廠方法;
(3)如果你希望使用現(xiàn)有對(duì)象來(lái)節(jié)省系統(tǒng)資源,而不是每次都重新創(chuàng)建對(duì)象,可使用工廠方法;
工廠方法可以返回緩存、對(duì)象池或其他來(lái)源的已有對(duì)象。

1. 優(yōu)點(diǎn)
  1. 避免創(chuàng)建者和具體產(chǎn)品之間的緊密耦合;
  2. 單一職責(zé)原則:將產(chǎn)品創(chuàng)建代碼放在程序的單一位置,從而使代碼更容易維護(hù);
  3. 開(kāi)閉原則:無(wú)須改變現(xiàn)有的客戶端代碼,就可以在程序中引入新的產(chǎn)品類(lèi)型;
  • 缺點(diǎn)
  1. 需要引入許多新的子類(lèi), 代碼可能會(huì)因此變得更復(fù)雜。 最好的情況是將該模式引入創(chuàng)建者類(lèi)的現(xiàn)有層次結(jié)構(gòu)中。
2. 抽象工廠(Abstract Factory)
  • 意圖(Intent):
    Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
    提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)的對(duì)象的接口,而無(wú)需指定它們具體的類(lèi)。
  • 抽象工廠中的角色
    抽象工廠(Abstract Factory)
    具體工廠(Concrete Factory)
    抽象產(chǎn)品(Abstract Product)
    ——聲明同一種類(lèi)型的產(chǎn)品接口;
    具體產(chǎn)品(Concrete Product)
    —— 定義一個(gè)被相應(yīng)的具體工廠創(chuàng)建的產(chǎn)品對(duì)象。
  • 適用場(chǎng)景:
    簡(jiǎn)單工廠模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)(即繼承自同一種抽象產(chǎn)品的體系),而抽象工廠針對(duì)的是多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。
    對(duì)于新增加的產(chǎn)品族,只需要對(duì)應(yīng)增加一個(gè)新的具體工廠即可,對(duì)已有代碼無(wú)須做任何修改。
  • 優(yōu)缺點(diǎn):
    ① 分離了具體的類(lèi);
    ② 可以很方便的動(dòng)態(tài)更換產(chǎn)品族
    只要更換具體工廠,就可以做到更換產(chǎn)品族(product families),因?yàn)橐粋€(gè)具體工廠會(huì)創(chuàng)建一整個(gè)產(chǎn)品族(a complete family of products)。
    系統(tǒng)中有多于一個(gè)的產(chǎn)品族,而每次只使用其中某一個(gè)產(chǎn)品族。
    ③ 有利于保持產(chǎn)品的一致性
    屬于同一個(gè)產(chǎn)品族的產(chǎn)品將在一起使用,這一約束必須在系統(tǒng)的設(shè)計(jì)中體現(xiàn)出來(lái)。
    ④ 添加新的產(chǎn)品類(lèi)型比較困難,因?yàn)锳bstractFactory接口確定了所有可以被創(chuàng)建的產(chǎn)品集合,支持新種類(lèi)的產(chǎn)品就需要擴(kuò)展該工廠接口,這將涉及AbstractFactory及其所有子類(lèi)的更改。
    當(dāng)Abstract Factory模式中每一種具體工廠類(lèi)只創(chuàng)建一個(gè)產(chǎn)品對(duì)象時(shí),也就是只存在一個(gè)產(chǎn)品體系結(jié)構(gòu)時(shí),退化為Factory Method模式;
    當(dāng)Factory Method模式中抽象工廠與具體工廠合并,提供一個(gè)統(tǒng)一的工廠來(lái)創(chuàng)建對(duì)象,并將創(chuàng)建對(duì)象的工廠設(shè)計(jì)為靜態(tài)方法時(shí),就退化為Simple Factory模式;
3. 生成器(Builder)

意圖(Intent):
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
將一個(gè)復(fù)雜對(duì)象的構(gòu)建(construction )與它每一過(guò)程中的實(shí)現(xiàn)細(xì)節(jié)分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建(create)出不同類(lèi)型(types )和形式(representations)的產(chǎn)品對(duì)象。


image.png
4. 原型(Prototype)

意圖(Intent):
Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.
用原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi),并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。

5. 單例(Singleton)

意圖(Intent):
Ensure a class only has one instance, and provide a global point of access to it.
保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。

二、結(jié)構(gòu)型模式(Structural Patterns)

6. 適配器(Adapter)

6.1 Intent
Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.
將一個(gè)類(lèi)的接口轉(zhuǎn)化成客戶端希望的另一個(gè)接口。Adaper模式使得接口不兼容的類(lèi)可以一起工作。
6.2 與其它模式的關(guān)系:

  • Bridge VS Adapter
    Bridge模式通常會(huì)于開(kāi)發(fā)前期進(jìn)行設(shè)計(jì), 使你能夠?qū)⒊绦虻母鱾€(gè)部分獨(dú)立開(kāi)來(lái)以便開(kāi)發(fā)。 而Adapter模式通常在已有程序中使用, 讓相互不兼容的類(lèi)能很好地合作。


    Adapter Pattern.png
  • Adaper VS Decorator
    Adapter修改了已有對(duì)象的接口;
    Decorator則是在不改變對(duì)象接口的情況下,強(qiáng)化(enhance)了其功能。
    Decorator還支持遞歸組合,而Adapter則無(wú)法實(shí)現(xiàn)。

  • Adapter VS Proxy VS Decorator
    Adapter為被封裝對(duì)象(wrapped object)提供了不同的接口;
    Proxy則為其提供了相同的接口,Decorator則能為其提供加強(qiáng)的接口(enhanced interface)。

  • Facade VS Adapter
    Facade為已有對(duì)象定義了一個(gè)新接口,而Adaper則盡力使得已有接口可復(fù)用。Adapter通常只封裝一個(gè)對(duì)象, 而Facade通常作用在整個(gè)子系統(tǒng)的對(duì)象上。

  • Bridge VS State VS Strategy
    他們的共同點(diǎn)是都基于組合來(lái)實(shí)現(xiàn)代碼結(jié)構(gòu)。

7. 橋接(Bridge)

Decouple an abstraction from its implementation so that the two can vary independently.
將抽象部分與它的實(shí)現(xiàn)部分分離,使兩者可以獨(dú)立的變化。
當(dāng)在兩個(gè)獨(dú)立維度的層次結(jié)構(gòu)中使用繼承擴(kuò)展類(lèi)時(shí),將導(dǎo)致代碼復(fù)雜程度指數(shù)增長(zhǎng)。橋接模式通過(guò)將繼承改為組合的方式來(lái)解決這個(gè)問(wèn)題。 具體來(lái)說(shuō), 就是抽取其中一個(gè)維度、只持有它的抽象引用,具體的實(shí)現(xiàn)部分可以動(dòng)態(tài)替換。
適用場(chǎng)景:

  1. 如果你想要拆分或重組一個(gè)具有多重功能的龐雜類(lèi) (例如能與多個(gè)數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行交互的類(lèi)), 可以使用橋接模式。
    類(lèi)的代碼行數(shù)越多, 弄清其運(yùn)作方式就越困難, 對(duì)其進(jìn)行修改所花費(fèi)的時(shí)間就越長(zhǎng)。 一個(gè)功能上的變化可能需要在整個(gè)類(lèi)范圍內(nèi)進(jìn)行修改, 而且常常會(huì)產(chǎn)生錯(cuò)誤, 甚至還會(huì)有一些嚴(yán)重的副作用。
    橋接模式可以將龐雜類(lèi)拆分為幾個(gè)類(lèi)層次結(jié)構(gòu)。 此后, 你可以修改任意一個(gè)類(lèi)層次結(jié)構(gòu)而不會(huì)影響到其他類(lèi)層次結(jié)構(gòu)。 這種方法可以簡(jiǎn)化代碼的維護(hù)工作, 并將修改已有代碼的風(fēng)險(xiǎn)降到最低。
  2. 如果你希望在幾個(gè)獨(dú)立維度上擴(kuò)展一個(gè)類(lèi), 可使用該模式。
    橋接建議將每個(gè)維度抽取為獨(dú)立的類(lèi)層次。 初始類(lèi)將相關(guān)工作委派給屬于對(duì)應(yīng)類(lèi)層次的對(duì)象, 無(wú)需自己完成所有工作。
  3. 如果你需要在運(yùn)行時(shí)切換不同實(shí)現(xiàn)方法, 可使用橋接模式。
解決方案
Bridge Pattern.png
8. 組合(Composite)

Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.
將對(duì)象組合成樹(shù)狀結(jié)構(gòu)、以表示“部分-整體”的層次結(jié)構(gòu)。Composite使得用戶可以相同的方式對(duì)待單個(gè)對(duì)象和復(fù)雜對(duì)象的組合(容器對(duì)象)。

9. 裝飾(Decorator)

Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.
通過(guò)將對(duì)象(Wrappee Object)放入特殊封裝對(duì)象(Wrapper Objects)為原對(duì)象增加新的行為。


Decorator pattern.png
10. 外觀(Facade)

Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.
為包含許多活動(dòng)部件的復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單的接口。Facade定義了一個(gè)更高層次的接口、使得子系統(tǒng)更加易用。

11. 享元(Flyweight)

Use sharing to support large numbers of fine-grained objects efficiently.
享元是一種結(jié)構(gòu)型設(shè)計(jì)模式, 它允許你在消耗少量?jī)?nèi)存的情況下支持大量對(duì)象。模式通過(guò)共享多個(gè)對(duì)象的部分狀態(tài)來(lái)實(shí)現(xiàn)上述功能。 換句話來(lái)說(shuō), 享元會(huì)將不同對(duì)象的相同數(shù)據(jù)進(jìn)行緩存以節(jié)省內(nèi)存。

12. 代理(Proxy)

Provide a surrogate or placeholder for another object to control access to it.
為源對(duì)象提供一個(gè)替代品或占位符,以實(shí)現(xiàn)對(duì)源對(duì)象的控制。
代理模式適合應(yīng)用場(chǎng)景:

  1. 延遲初始化(虛擬代理)
    如果你有一個(gè)偶爾使用的重量級(jí)服務(wù)對(duì)象,一直保持該對(duì)象運(yùn)行會(huì)消耗系統(tǒng)資源時(shí),可使用代理模式。
  2. 訪問(wèn)控制(保護(hù)代理)
    如果你只希望特定客戶端使用服務(wù)對(duì)象,這里的對(duì)象可以是操作系統(tǒng)中非常重要對(duì)的部分,而客戶端則是各種已啟動(dòng)的程序(包括惡意程序),此時(shí)可使用代理模式。代理可僅在客戶端憑據(jù)滿足要求時(shí)將請(qǐng)求傳遞給服務(wù)對(duì)象。
  3. 本地執(zhí)行遠(yuǎn)程服務(wù)(遠(yuǎn)程代理)
    適用于服務(wù)對(duì)象位于遠(yuǎn)程服務(wù)器上的情形,代理通過(guò)網(wǎng)絡(luò)傳遞客戶端請(qǐng)求,負(fù)責(zé)處理所有與網(wǎng)絡(luò)相關(guān)的復(fù)雜細(xì)節(jié)。
  4. 記錄日志請(qǐng)求(日志記錄代理)
    適用于當(dāng)你需要保存對(duì)于服務(wù)對(duì)象的請(qǐng)求歷史記錄時(shí)。 代理可以在向服務(wù)傳遞請(qǐng)求前進(jìn)行記錄。
  5. 緩存結(jié)果代理(緩存代理)
    適用于需要緩存客戶請(qǐng)求結(jié)果并對(duì)緩存生命周期進(jìn)行管理時(shí), 特別是當(dāng)返回結(jié)果的體積非常大時(shí)。代理可對(duì)重復(fù)請(qǐng)求所需的相同結(jié)果進(jìn)行緩存, 還可使用請(qǐng)求參數(shù)作為索引緩存的鍵值。
  6. 智能引用
    代理會(huì)將所有獲取了指向服務(wù)對(duì)象或其結(jié)果的客戶端記錄在案。 代理會(huì)時(shí)不時(shí)地遍歷各個(gè)客戶端, 檢查它們是否仍在運(yùn)行。 如果相應(yīng)的客戶端列表為空, 代理就會(huì)銷(xiāo)毀該服務(wù)對(duì)象, 釋放底層系統(tǒng)資源。
  • 與其它模式的關(guān)系
    Adaper能為封裝對(duì)象(wrapped object)提供不同的接口;Proxy能為封裝對(duì)象提供相同的接口;Decorator則能為之提供加強(qiáng)的接口。
    Facade與Proxy的相似之處在于它們都緩存了一個(gè)復(fù)雜實(shí)體( complex entity)并且按照自己的方式進(jìn)行實(shí)例化;不同之處是代理與其服務(wù)對(duì)象遵循同一接口, 使得自己和服務(wù)對(duì)象可以互換。
    Decorator與Proxy的不同之處在于代理通常自行管理其服務(wù)對(duì)象的生命周期,然后Decorator中裝飾器的組合通常用客戶端來(lái)控制。

三、行為模式(BehavioralPatterns)

13. 職責(zé)鏈(Chain Of Responsibility)

Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.
職責(zé)鏈允許你將請(qǐng)求沿著處理者鏈進(jìn)行發(fā)送。 收到請(qǐng)求后, 每個(gè)處理者均可對(duì)請(qǐng)求進(jìn)行處理, 或?qū)⑵鋫鬟f給鏈上的下個(gè)處理者。
責(zé)任鏈會(huì)將特定行為(particular behaviors)轉(zhuǎn)化為稱(chēng)為處理者(handles)的獨(dú)立對(duì)象。模式建議你將這些處理者連成一條鏈。 鏈上的每個(gè)處理者都持有下一處理者的引用(reference)。 除了處理請(qǐng)求外, 處理者還負(fù)責(zé)沿著鏈傳遞請(qǐng)求。 請(qǐng)求會(huì)在鏈上移動(dòng), 直至所有處理者都有機(jī)會(huì)對(duì)其進(jìn)行處理。處理者可以決定不再沿著鏈傳遞請(qǐng)求, 這可高效地取消所有后續(xù)處理步驟。

14. 命令(Command)

Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.
將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使可以將請(qǐng)求作為函數(shù)的參數(shù)傳遞、延遲請(qǐng)求執(zhí)行或者將其放入隊(duì)列中、記錄請(qǐng)求日志,以及支持撤銷(xiāo)操作。

15. 解釋器(Interpreter)

Given a language, define a represention for its grammar along with an interpreter that uses the representation to interpret sentences in the language.
給定一種語(yǔ)言,定義它的語(yǔ)法的一種表示,同時(shí)定義一個(gè)解釋器(interpreter),該解釋器使用定義好的語(yǔ)法表示(grammar represention)來(lái)解釋語(yǔ)言中的句子。

16. 迭代器(Iterator)

Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
在不暴露一個(gè)聚合對(duì)象(aggregate object)的內(nèi)部表示形式的情況下,有序訪問(wèn)集合中的各個(gè)元素。
Iterator的主要思想是將集合的遍歷行為提取為稱(chēng)為iterator的獨(dú)立對(duì)象。
應(yīng)用場(chǎng)景:

  1. 當(dāng)集合背后為復(fù)雜的數(shù)據(jù)結(jié)構(gòu), 且你希望對(duì)客戶端隱藏其復(fù)雜性時(shí) (出于使用便利性或安全性的考慮), 可以使用迭代器模式。
  2. 使用該模式可以減少程序中重復(fù)的遍歷代碼。
  3. 如果你希望代碼能夠遍歷不同的甚至是無(wú)法預(yù)知的數(shù)據(jù)結(jié)構(gòu), 可以使用迭代器模式。
17. 中介者(Mediator)

Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.
用一個(gè)中介對(duì)象來(lái)封裝一系列對(duì)象的交互。Mediator使得各對(duì)象不需要顯式的相互引用,從而使其松散耦合,而且可以獨(dú)立地改變它們之間的交互。
中介者讓一個(gè)程序的不同組件(components)通過(guò)特殊的Mediator對(duì)象進(jìn)行間接的溝通,從而減少組件間的相互依賴(lài)。
中介者讓你能在單個(gè)中介者對(duì)象中封裝多個(gè)對(duì)象間的復(fù)雜關(guān)系網(wǎng)。類(lèi)所擁有的依賴(lài)關(guān)系越少,就越易于修改、擴(kuò)展和復(fù)用。

適用場(chǎng)景:

  1. 當(dāng)一些對(duì)象和其他對(duì)象緊密耦合以致難以對(duì)其進(jìn)行修改時(shí),可使用中介者模式;
  2. 當(dāng)組件因過(guò)于依賴(lài)其他組件,而無(wú)法在不同應(yīng)用中復(fù)用時(shí),可使用中介者模式;
  3. 如果為了能在不同情景下復(fù)用一些基本行為, 導(dǎo)致你需要被迫創(chuàng)建大量組件子類(lèi)時(shí), 可使用中介者模式。
18. 備忘錄(Memento)

Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later.
在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài),這樣以后就可以將該對(duì)象恢復(fù)到原來(lái)保存的狀態(tài)。

19. 觀察者(Observer)

Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

20. 狀態(tài)(State)

Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.
允許一個(gè)對(duì)象在它的內(nèi)部狀態(tài)改變時(shí)改變其行為,使其看上去就行改變了自身所屬的類(lèi)一樣。
該模式將與狀態(tài)相關(guān)的行為抽取到獨(dú)立的狀態(tài)類(lèi)中, 讓原對(duì)象將工作委派給這些類(lèi)的實(shí)例, 而不是自行進(jìn)行處理。


State pattern.png
21. 策略(Strategy)

Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
定義一系列算法,將每一個(gè)算法封裝起來(lái),并使它們可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而變化。

22. 模板方法(Template Method)

Define the skeleton of an algorithm in an operation, deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
在超類(lèi)中定義了一個(gè)算法的框架,允許子類(lèi)在不修改結(jié)構(gòu)的情況下重寫(xiě)算法的特定步驟。
應(yīng)用場(chǎng)景:
當(dāng)你希望客戶端只是擴(kuò)展某個(gè)特定的步驟、而不是整個(gè)算法或其結(jié)構(gòu)時(shí),可使用模板方法模式。
在將算法轉(zhuǎn)化為模板方法時(shí),你可將相似的步驟提取到超類(lèi)中以去除重復(fù)的代碼,子類(lèi)間各不同的代碼可繼續(xù)保留在各子類(lèi)中。
實(shí)現(xiàn)方式:

  1. 分析目標(biāo)算法,確定能否將其拆分為多個(gè)步驟,從所有子類(lèi)的角度出發(fā),考慮哪些步驟能夠通用,哪些步驟各不相同;
  2. 創(chuàng)建抽象基類(lèi)并聲明一個(gè)模板方法、和代表算法步驟的一系列抽象方法,在模板方法中根據(jù)算法結(jié)構(gòu)依次調(diào)用相應(yīng)步驟,可用final修飾模板方法以防止子類(lèi)對(duì)其進(jìn)行重寫(xiě)。
  3. 雖然可將所有步驟全都設(shè)為抽象類(lèi)型, 但默認(rèn)實(shí)現(xiàn)可能會(huì)給部分步驟帶來(lái)好處, 因?yàn)樽宇?lèi)無(wú)需實(shí)現(xiàn)那些方法。
  4. 可考慮在算法的關(guān)鍵步驟之間添加鉤子。
  5. 為每個(gè)算法變體新建一個(gè)具體子類(lèi), 它必須實(shí)現(xiàn)所有的抽象步驟, 也可以重寫(xiě)部分可選步驟。
23. 訪問(wèn)者(Visitor)

Represent an operation to be performed on the elements of an object structure.Visitor lets you define a new operation without changing the classes of the elements on which it operates.
允許你在不修改已有代碼的情況下,向已有類(lèi)層次結(jié)構(gòu)中增加新的行為。
Visitor模式建議將新行為放在一個(gè)稱(chēng)為Visitor的獨(dú)立類(lèi)中,而不是試圖將其整合到已有類(lèi)中。需要執(zhí)行操作的源對(duì)象(original object )將作為參數(shù)傳遞給Visitor的方法的,從而使改方法能訪問(wèn)源對(duì)象的一切必要數(shù)據(jù)。
Visitor類(lèi)可以定義一組 (而不是一個(gè)) 方法, 且每個(gè)方法可接收不同類(lèi)型的參數(shù)。


visitor_pattern.png

實(shí)現(xiàn)方式:

  1. 在Visitor接口中聲明一組“訪問(wèn)”方法,分別對(duì)應(yīng)程序中的每個(gè)具體元素類(lèi);
  2. 聲明Element接口,在其中添加“accept”方法,接收一個(gè)Visitor對(duì)象作為參數(shù)。
  3. 在所有具體的Concrete Element類(lèi)中實(shí)現(xiàn)“accept”方法,這些方法必須將調(diào)用重定向到Visitor對(duì)象的的visitXXX方法中,其中visitXXX方法的參數(shù)為當(dāng)前的Concrete Element類(lèi)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容