




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、軟件體系結(jié)構(gòu),第十章 結(jié)構(gòu)型模式,結(jié)構(gòu)性模式,概述 結(jié)構(gòu)型模式(Structural Pattern)描述如何將類或者對(duì)象結(jié)合在一起形成更大的結(jié)構(gòu),就像搭積木,可以通過簡(jiǎn)單積木的組合形成復(fù)雜的、功能更為強(qiáng)大的結(jié)構(gòu)。,結(jié)構(gòu)性模式,概述 根據(jù)這一點(diǎn),結(jié)構(gòu)型模式可以分為類結(jié)構(gòu)型模式和對(duì)象結(jié)構(gòu)型模式: 類結(jié)構(gòu)型模式關(guān)心類的組合,由多個(gè)類可以組合成一個(gè)更大的系統(tǒng),在類結(jié)構(gòu)型模式中一般只存在繼承關(guān)系和實(shí)現(xiàn)關(guān)系。 對(duì)象結(jié)構(gòu)型模式關(guān)心類與對(duì)象的組合,通過關(guān)聯(lián)關(guān)系使得在一個(gè)類中定義另一個(gè)類的實(shí)例對(duì)象,然后通過該對(duì)象調(diào)用其方法。根據(jù)“合成復(fù)用原則”,在系統(tǒng)中盡量使用關(guān)聯(lián)關(guān)系來替代繼承關(guān)系,因此大部分結(jié)構(gòu)型模式都是
2、對(duì)象結(jié)構(gòu)型模式。,本章的內(nèi)容與目標(biāo) 適配器模式(Adapter) 橋接模式(Bridge) 組合模式(Composite) 裝飾模式(Decorator) 外觀模式(Facade) 享元模式(Flyweight) 代理模式(Proxy),適配器模式,意圖 適配器,適配器模式,意圖 適配器,適配器,適配器模式,意圖 軟件系統(tǒng)中的適配器,適配器模式,意圖 軟件系統(tǒng)中的適配器,適配器模式,意圖 軟件系統(tǒng)中的適配器 方法一:修改system或修改B,都違反開閉原則,適配器模式,意圖 軟件系統(tǒng)中的適配器 方法二:增加適配器,適配器模式,意圖 軟件系統(tǒng)中的適配器 方法二:增加適配器,適配器模式,意圖 在軟
3、件開發(fā)中采用類似于電源適配器的設(shè)計(jì)和編碼技巧被稱為適配器模式。 通常情況下,客戶端可以通過目標(biāo)類的接口訪問它所提供的服務(wù)。有時(shí),現(xiàn)有的類可以滿足客戶類的功能需要,但是它所提供的接口不是客戶類所期望的,比如:現(xiàn)有類中方法名與目標(biāo)類中定義的方法名不一致等原因所導(dǎo)致的 在這種情況下,現(xiàn)有的接口需要轉(zhuǎn)化為客戶類期望的接口,這樣保證了對(duì)現(xiàn)有類的重用。如果不進(jìn)行這樣的轉(zhuǎn)化,客戶類就不能利用現(xiàn)有類所提供的功能,適配器模式可以完成這樣的轉(zhuǎn)化。,適配器模式,意圖 在適配器模式中可以定義一個(gè)包裝類,包裝不兼容接口的對(duì)象,這個(gè)包裝類指的就是適配器(Adapter),它所包裝的對(duì)象就是適配者(Adaptee),即被適
4、配的類。 適配器提供客戶類需要的接口,適配器的實(shí)現(xiàn)就是把客戶類的請(qǐng)求轉(zhuǎn)化為對(duì)適配者的相應(yīng)接口的調(diào)用。 也就是說:當(dāng)客戶類調(diào)用適配器的方法時(shí),在適配器類的內(nèi)部將調(diào)用適配者類的方法,而這個(gè)過程對(duì)客戶類是透明的,客戶類并不直接訪問適配者類。 因此,適配器可以使由于接口不兼容而不能交互的類可以一起工作。這就是適配器模式的模式動(dòng)機(jī)。,適配器模式,模式定義 適配器模式(Adapter Pattern) :將一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,適配器模式使接口不兼容的那些類可以一起工作,其別名為包裝器(Wrapper)或變壓器。適配器模式既可以作為類結(jié)構(gòu)型模式,也可以作為對(duì)象結(jié)構(gòu)型模式。 Convert t
5、he interface of a class into another interface clients expect. Adapter lets classes work together that couldnt otherwise because of incompatible interfaces. Frequency of use: medium high,適配器模式,模式角色 Target:目標(biāo)抽象類 Adapter:適配器類 Adaptee:適配者(源角色)類 Client:客戶類,適配器模式,模式結(jié)構(gòu) 類適配器:適配器與適配者是繼承關(guān)系,適配器模式,模式結(jié)構(gòu) 對(duì)象適配器:適
6、配器與適配者是關(guān)聯(lián)關(guān)系,適配器模式,模式實(shí)現(xiàn) 類適配器的典型代碼,適配器模式,模式實(shí)現(xiàn) 對(duì)象適配器代碼的典型代碼,適配器模式,例1:仿生機(jī)器人 現(xiàn)需要設(shè)計(jì)一個(gè)可以模擬各種動(dòng)物行為的機(jī)器人,在機(jī)器人中定義了一系列方法,如機(jī)器人叫喊方法cry()、機(jī)器人移動(dòng)方法move()等。如果希望在不修改已有代碼的基礎(chǔ)上使得機(jī)器人能夠像狗一樣叫,像狗一樣跑,使用適配器模式進(jìn)行系統(tǒng)設(shè)計(jì),適配器模式,例1:仿生機(jī)器人,適配器模式,例1:仿生機(jī)器人 目標(biāo)類:Robot接口,public interface Robot public void cry(); public void move(); ,適配器模式,例1:
7、仿生機(jī)器人 適配者類:dog類,public class Dog public void wang() System.out.println(狗汪汪叫!); public void run() System.out.println(狗快快跑!); ,適配器模式,例1:仿生機(jī)器人 適配器類:dog類,public class DogAdapter extends Dog implements Robot public void cry() System.out.print(機(jī)器人模仿:); super.wang(); public void move() System.out.print(機(jī)器人
8、模仿:); super.run(); ,適配器模式,例1:仿生機(jī)器人 客戶端,public class Client public static void main(String args) Robot robot=(Robot)XMLUtil.getBean(); robot.cry(); robot.move(); , DogAdapter ,適配器模式,例2:加密適配器 某系統(tǒng)需要提供一個(gè)加密模塊,將用戶信息(如密碼等機(jī)密信息)加密之后再存儲(chǔ)在數(shù)據(jù)庫(kù)中,系統(tǒng)已經(jīng)定義好了數(shù)據(jù)庫(kù)操作類。 為了提高開發(fā)效率,現(xiàn)需要重用已有的加密算法,這些算法封裝在一些由第三方提供的類中,有些甚至沒有源代碼。
9、使用適配器模式設(shè)計(jì)該加密模塊,實(shí)現(xiàn)在不修改現(xiàn)有類的基礎(chǔ)上重用第三方加密方法。,適配器模式,例2:加密適配器,適配器模式,例2:加密適配器 目標(biāo)類: DataOperation,public abstract class DataOperation private String password; public void setPassword(String password) this.password=password; public String getPassword() return this.password; public abstract String doEncrypt(int
10、 key,String ps); ,適配器模式,例2:加密適配器 適配者類: Caesar,public final class Caesar public String doEncrypt(int key,String ps) String es=; for(int i=0;i=a ,適配器模式,例2:加密適配器 適配器類: CipherAdapter,public class CipherAdapter extends DataOperation private Caesar cipher; public CipherAdapter() cipher=new Caesar(); publi
11、c String doEncrypt(int key,String ps) return cipher.doEncrypt(key,ps); ,適配器模式,例2:加密適配器 新適配者類: NewCipher,public final class NewCipher public String doEncrypt(int key,String ps) String es=; for(int i=0;ips.length();i+) String c=String.valueOf(ps.charAt(i)%key); es+=c; return es; ,適配器模式,例2:加密適配器 新適配器類:
12、 NewCipherAdapter,public class NewCipherAdapter extends DataOperation private NewCipher cipher; public NewCipherAdapter() cipher=new NewCipher(); public String doEncrypt(int key,String ps) return cipher.doEncrypt(key,ps); ,適配器模式,例2:加密適配器 客戶端類:,public class Client public static void main(String args)
13、 DataOperation dao=(DataOperation)XMLUtil.getBean(); dao.setPassword(sunnyLiu); String ps=dao.getPassword(); String es=dao.doEncrypt(6,ps); System.out.println(明文為: + ps); System.out.println(密文為: + es); ,適配器模式,評(píng)價(jià) 總體優(yōu)點(diǎn): 將目標(biāo)類和適配者類解耦,通過引入一個(gè)適配器類來重用現(xiàn)有的適配者類,而無需修改原有代碼。 增加了類的透明性和復(fù)用性,將具體的實(shí)現(xiàn)封裝在適配者類中,對(duì)于客戶端類來說是透
14、明的,而且提高了適配者的復(fù)用性。 靈活性和擴(kuò)展性都非常好,通過使用配置文件,可以很方便地更換適配器,也可以在不修改原有代碼的基礎(chǔ)上增加新的適配器類,完全符合“開閉原則”。,適配器模式,評(píng)價(jià) 類適配器優(yōu)點(diǎn): 由于適配器類是適配者類的子類,因此可以在適配器類中置換一些適配者的方法,使得適配器的靈活性更強(qiáng)。 類適配器缺點(diǎn): 對(duì)于Java、C#等不支持多重繼承的語言,一次最多只能適配一個(gè)適配者類,而且目標(biāo)抽象類只能為抽象類,不能為具體類,其使用有一定的局限性,不能將一個(gè)適配者類和它的子類都適配到目標(biāo)接口。,適配器模式,評(píng)價(jià) 對(duì)象適配器優(yōu)點(diǎn): 一個(gè)對(duì)象適配器可以把多個(gè)不同的適配者適配到同一個(gè)目標(biāo),也就是
15、說,同一個(gè)適配器可以把適配者類和它的子類都適配到目標(biāo)接口。 對(duì)象適配器缺點(diǎn): 與類適配器模式相比,要想置換適配者類的方法就不容易。如果一定要置換掉適配者類的一個(gè)或多個(gè)方法,就只好先做一個(gè)適配者類的子類,將適配者類的方法置換掉,然后再把適配者類的子類當(dāng)做真正的適配者進(jìn)行適配,實(shí)現(xiàn)過程較為復(fù)雜。,適配器模式,評(píng)價(jià) 適用環(huán)境: 系統(tǒng)需要使用現(xiàn)有的類,而這些類的接口不符合系統(tǒng)的需要。 想要建立一個(gè)可以重復(fù)使用的類,用于與一些彼此之間沒有太大關(guān)聯(lián)的一些類,包括一些可能在將來引進(jìn)的類一起工作。,適配器模式,模式擴(kuò)展 缺省適配器模式(Default Adapter Pattern) 存在一個(gè)功能強(qiáng)大的接口,
16、但很多時(shí)候只需要實(shí)現(xiàn)和使用其中的一部分方法 可先設(shè)計(jì)一個(gè)抽象類實(shí)現(xiàn)接口,并為該接口中每個(gè)方法提供一個(gè)默認(rèn)實(shí)現(xiàn)(空方法)。 然后,該抽象類的子類可有選擇地覆蓋父類的某些方法來實(shí)現(xiàn)需求,它適用于一個(gè)接口不想使用其所有的方法的情況。 這種方式稱為缺省適配器模式,是適配器類型的簡(jiǎn)化,也稱為單接口適配器模式。,適配器模式,模式擴(kuò)展 缺省適配器模式 適配者接口 缺省適配器類 具體業(yè)務(wù)類,適配器模式,模式擴(kuò)展 缺省適配器模式,適配器模式,模式擴(kuò)展 雙向適配器 在對(duì)象適配器的使用過程中,如果在適配器中同時(shí)包含對(duì)目標(biāo)類和適配者類的引用,適配者可以通過它調(diào)用目標(biāo)類中的方法,目標(biāo)類也可以通過它調(diào)用適配者類中的方法,
17、那么該適配器就是一個(gè)雙向適配器。,適配器模式,模式擴(kuò)展 雙向適配器,橋接模式,意圖,橋接模式,意圖 現(xiàn)需要提供大中小3種型號(hào)的畫筆,能夠繪制5種不同顏色。,如果使用蠟筆,需要多少支蠟筆?,如果使用毛筆,需要多少支毛筆?,毛筆和蠟筆的區(qū)別是什么?,橋接模式,意圖 設(shè)想如果要繪制矩形、圓形、橢圓、正方形,我們至少需要4個(gè)形狀類,但是如果繪制的圖形需要具有不同的顏色,如紅色、綠色、藍(lán)色等,此時(shí)至少有如下兩種設(shè)計(jì)方案: 第一種設(shè)計(jì)方案是為每一種形狀都提供一套各種顏色的版本。 第二種設(shè)計(jì)方案是根據(jù)實(shí)際需要對(duì)形狀和顏色進(jìn)行組合。,橋接模式,意圖,1,2,橋接模式,意圖 對(duì)于有兩個(gè)變化維度(即兩個(gè)變化的原因
18、)的系統(tǒng),采用方案二來進(jìn)行設(shè)計(jì)系統(tǒng)中類的個(gè)數(shù)更少,且系統(tǒng)擴(kuò)展更為方便。設(shè)計(jì)方案二即是橋接模式的應(yīng)用。 橋接模式將繼承關(guān)系轉(zhuǎn)換為關(guān)聯(lián)關(guān)系,從而降低了類與類之間的耦合,減少了代碼編寫量。,橋接模式,意圖,橋接模式,模式定義 橋接模式(Bridge Pattern):將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。它是一種對(duì)象結(jié)構(gòu)型模式,又稱為柄體(Handle and Body)模式或接口(Interface)模式。 Bridge Pattern: Decouple an abstraction from its implementation so that the two can vary
19、 independently. Frequency of use: medium,橋接模式,模式定義 橋接模式的核心在于抽象化與實(shí)現(xiàn)化 脫耦。 抽象化:在面向?qū)ο笾?,將?duì)象的共同性質(zhì)抽取出來形成類的過程即為抽象化的過程。 實(shí)現(xiàn)化:針對(duì)抽象化給出的具體實(shí)現(xiàn),就是實(shí)現(xiàn)化。實(shí)現(xiàn)化產(chǎn)生的對(duì)象比抽象化更具體,是對(duì)抽象化事物的進(jìn)一步具體化的產(chǎn)物。 脫耦:脫耦就是將抽象化和實(shí)現(xiàn)化之間的耦合解脫開,或者說是將它們之間的強(qiáng)關(guān)聯(lián)改換成弱關(guān)聯(lián),將兩個(gè)角色之間的繼承關(guān)系改為關(guān)聯(lián)關(guān)系 簡(jiǎn)單地說:脫耦,就是在軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用關(guān)聯(lián)關(guān)系(組合或者聚合關(guān)系)而不是繼承關(guān)系(合成復(fù)用原則)。,橋接模式,模式結(jié)構(gòu),
20、橋接模式,角色: Abstraction:抽象類 RefinedAbstraction:擴(kuò)充抽象類 Implementor:實(shí)現(xiàn)類接口 ConcreteImplementor:具體實(shí)現(xiàn)類,橋接模式,模式實(shí)現(xiàn) Implementor實(shí)現(xiàn)類接口代碼:,橋接模式,模式實(shí)現(xiàn) Abstraction抽象類代碼:,橋接模式,模式實(shí)現(xiàn) RefinedAbstraction擴(kuò)充抽象類代碼:,橋接模式,例1:模擬毛筆 現(xiàn)需要提供大中小3種型號(hào)的畫筆,能夠繪制5種不同顏色。 如果使用蠟筆,我們需要準(zhǔn)備3*5=15支蠟筆,也就是說必須準(zhǔn)備15個(gè)具體的蠟筆類。 而如果使用毛筆的話,只需要3種型號(hào)的毛筆,外加5個(gè)顏料盒
21、,用3+5=8個(gè)類就可以實(shí)現(xiàn)15支蠟筆的功能。 本實(shí)例使用橋接模式來模擬毛筆的使用過程。,橋接模式,例1:模擬毛筆,橋接模式,例1:模擬毛筆 Abstraction抽象類,public abstract class Pen protected Color color; public void setColor(Color color) this.color=color; public abstract void draw(String name); ,橋接模式,例1:模擬毛筆 RefinedAbstraction擴(kuò)充抽象類 大號(hào)毛筆,public class BigPen extends Pe
22、n public void draw(String name) String penType=大號(hào)毛筆畫大家伙:; this.color.bepaint(penType,name); ,橋接模式,例1:模擬毛筆 RefinedAbstraction擴(kuò)充抽象類 中號(hào)毛筆,public class MiddlePen extends Pen public void draw(String name) String penType=“一般的圖形用中號(hào)毛筆:; this.color.bepaint(penType,name); ,橋接模式,例1:模擬毛筆 RefinedAbstraction擴(kuò)充抽象類
23、 小號(hào)毛筆,public class SmallPen extends Pen public void draw(String name) String penType=“小號(hào)毛筆畫精細(xì)圖像:; this.color.bepaint(penType,name); ,橋接模式,例1:模擬毛筆 Implementor實(shí)現(xiàn)類接口 顏色接口,public interface Color void bepaint(String penType,String name); ,橋接模式,例1:模擬毛筆 ConcreteImplementor:具體實(shí)現(xiàn)類 紅色,public class Red impleme
24、nts Color public void bepaint(String penType,String name) System.out.println(penType + 紅色的+ name + .); ,橋接模式,例1:模擬毛筆 ConcreteImplementor:具體實(shí)現(xiàn)類 黑色,public class Black implements Color public void bepaint(String penType,String name) System.out.println(penType + 黑色的+ name + .); ,其他顏色類似,橋接模式,例1:模擬毛筆 客戶端類
25、,public class Client public static void main(String a) Color color; Pen pen; color=(Color)XMLUtilPen.getBean(color); pen=(Pen)XMLUtilPen.getBean(pen); pen.setColor(color); pen.draw(鮮花); , White SmallPen ,橋接模式,例2:我是山寨我怕誰 某公司,原來是做房地產(chǎn)的,通常都是豆腐渣。國(guó)家調(diào)控以后,生存不易,決定轉(zhuǎn)向IT行業(yè)。 不會(huì)做,怎么辦?老板說“沒關(guān)系,先做山寨”,隨便找?guī)讉€(gè)人,先山寨IPod
26、用橋接模式模擬該過程 要可以隨意更換山寨產(chǎn)品 有一天有實(shí)力了,要能夠做改頭換面,生產(chǎn)好的產(chǎn)品,橋接模式,例2:我是山寨我怕誰,橋接模式,例2:我是山寨我怕誰 抽象實(shí)現(xiàn)類,橋接模式,例2:我是山寨我怕誰 具體實(shí)現(xiàn)類,橋接模式,例2:我是山寨我怕誰 具體實(shí)現(xiàn)類,橋接模式,例2:我是山寨我怕誰 抽象類:公司,橋接模式,例2:我是山寨我怕誰 擴(kuò)充抽象類:房地產(chǎn)公司,橋接模式,例2:我是山寨我怕誰 擴(kuò)充抽象類:山寨公司,橋接模式,例2:我是山寨我怕誰 客戶端,橋接模式,評(píng)價(jià) 優(yōu)點(diǎn) 分離抽象接口及其實(shí)現(xiàn)部分。 橋接模式有時(shí)類似于多繼承方案,但是多繼承方案違背了類的單一職責(zé)原則(即一個(gè)類只有一個(gè)變化的原因)
27、,復(fù)用性比較差,而且多繼承結(jié)構(gòu)中類的個(gè)數(shù)非常龐大,橋接模式是比多繼承方案更好的解決方法。 橋接模式提高了系統(tǒng)的可擴(kuò)充性,在兩個(gè)變化維度中任意擴(kuò)展一個(gè)維度,都不需要修改原有系統(tǒng)。 實(shí)現(xiàn)細(xì)節(jié)對(duì)客戶透明,可以對(duì)用戶隱藏實(shí)現(xiàn)細(xì)節(jié)。,橋接模式,評(píng)價(jià) 缺點(diǎn) 橋接模式的引入會(huì)增加系統(tǒng)的理解與設(shè)計(jì)難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對(duì)抽象進(jìn)行設(shè)計(jì)與編程。 橋接模式要求正確識(shí)別出系統(tǒng)中兩個(gè)獨(dú)立變化的維度,因此其使用范圍具有一定的局限性。,橋接模式,評(píng)價(jià) 適用環(huán)境: 如果系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加靈活性,避免靜態(tài)的繼承聯(lián)系,橋接模式可以在抽象層建立關(guān)聯(lián)關(guān)系。 抽象化角色和實(shí)現(xiàn)化角色
28、可以以繼承的方式獨(dú)立擴(kuò)展而互不影響,在程序運(yùn)行時(shí)可以動(dòng)態(tài)將抽象化子類的對(duì)象和實(shí)現(xiàn)化子類的對(duì)象進(jìn)行組合,即系統(tǒng)需要對(duì)抽象化角色和實(shí)現(xiàn)化角色進(jìn)行動(dòng)態(tài)耦合。 一個(gè)類存在兩個(gè)獨(dú)立變化的維度,且兩個(gè)維度都需要進(jìn)行擴(kuò)展。 雖然在系統(tǒng)中使用繼承是沒有問題的,但是由于抽象化角色和具體化角色需要獨(dú)立變化,設(shè)計(jì)要求需要獨(dú)立管理這兩者。 對(duì)于那些不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類的個(gè)數(shù)急劇增加的系統(tǒng),橋接模式尤為適用。,橋接模式,模式擴(kuò)展 適配器模式與橋接模式的聯(lián)用 橋接模式和適配器模式用于設(shè)計(jì)的不同階段,橋接模式用于系統(tǒng)的初步設(shè)計(jì),對(duì)于存在兩個(gè)獨(dú)立變化維度的類可以將其分為抽象化和實(shí)現(xiàn)化兩個(gè)角色,使它們可以分
29、別進(jìn)行變化; 而在初步設(shè)計(jì)完成之后,當(dāng)發(fā)現(xiàn)系統(tǒng)與已有類無法協(xié)同工作時(shí),可以采用適配器模式。但有時(shí)候在設(shè)計(jì)初期也需要考慮適配器模式,特別是那些涉及到大量第三方應(yīng)用接口的情況。,橋接模式,模式擴(kuò)展 適配器模式與橋接模式的聯(lián)用,橋接模式,典型應(yīng)用 Java虛擬機(jī),橋接模式,典型應(yīng)用 類似的,許多跨平臺(tái)軟件 如:視頻播放器,組合模式,意圖 情人節(jié)的禮物,組合模式,意圖 更復(fù)雜的組合:企業(yè)的組織結(jié)構(gòu),組合模式,意圖,組合模式,意圖 組合模式是一個(gè)處理樹形結(jié)構(gòu)的模式。 樹:分支結(jié)點(diǎn)和葉子結(jié)點(diǎn), 組合模式:容器對(duì)象和葉子對(duì)象 組合模式描述了如何將容器對(duì)象和葉子對(duì)象進(jìn)行遞歸組合,即整體-部分的關(guān)系,組合模式,
30、意圖 由于容器對(duì)象和葉子對(duì)象在功能上的區(qū)別,在使用這些對(duì)象的客戶端代碼中必須有區(qū)別地對(duì)待容器對(duì)象和葉子對(duì)象,而實(shí)際上大多數(shù)情況下客戶端希望一致地處理它們,因?yàn)閷?duì)于這些對(duì)象的區(qū)別對(duì)待將會(huì)使得程序非常復(fù)雜。 組合模式使得客戶端把一個(gè)個(gè)單獨(dú)的成分對(duì)象和由他們復(fù)合而成的合成對(duì)象同等看待。使得用戶在使用時(shí)無須對(duì)它們進(jìn)行區(qū)分,可以一致地對(duì)待容器對(duì)象和葉子對(duì)象。,組合模式,模式定義 組合模式(Composite Pattern):組合多個(gè)對(duì)象形成樹形結(jié)構(gòu)以表示“整體-部分”的結(jié)構(gòu)層次。組合模式對(duì)單個(gè)對(duì)象(即葉子對(duì)象)和組合對(duì)象(即容器對(duì)象)的使用具有一致性。 組合模式又可以稱為“整體-部分”(Part-Wh
31、ole)模式,屬于對(duì)象的結(jié)構(gòu)模式,它將對(duì)象組織到樹結(jié)構(gòu)中,可以用來描述整體與部分的關(guān)系。,組合模式,模式定義 Composite Pattern: Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. Frequency of use: medium high,組合模式,模式角色 Component: 抽象構(gòu)件 Leaf: 葉子構(gòu)
32、件 Composite: 容器構(gòu)件(分支構(gòu)件) Client: 客戶類,組合模式,模式結(jié)構(gòu),組合模式,模式結(jié)構(gòu) 組合模式的關(guān)鍵是定義了一個(gè)抽象構(gòu)件類,它既可以代表葉子,又可以代表容器,而客戶端針對(duì)該抽象構(gòu)件類進(jìn)行編程,無須知道它到底表示的是葉子還是容器,可以對(duì)其進(jìn)行統(tǒng)一處理。 同時(shí)容器對(duì)象與抽象構(gòu)件類之間還建立一個(gè)聚合關(guān)聯(lián)關(guān)系,在容器對(duì)象中既可以包含葉子,也可以包含容器,以此實(shí)現(xiàn)遞歸組合,形成一個(gè)樹形結(jié)構(gòu)。,組合模式,模式實(shí)現(xiàn) 抽象構(gòu)件類:,組合模式,模式實(shí)現(xiàn) 葉子構(gòu)件類:,組合模式,模式實(shí)現(xiàn) 容器構(gòu)件類:,組合模式,例1:文件瀏覽 文件有不同類型,不同類型的文件其瀏覽方式不同,如文本文件和圖
33、片文件的瀏覽方式就不相同。對(duì)文件夾的瀏覽實(shí)際上就是對(duì)其中所包含文件的瀏覽 客戶端可以一致地對(duì)文件和文件夾進(jìn)行“打開”操作,無須關(guān)心它們的區(qū)別。 使用組合模式來模擬文件的瀏覽操作。,組合模式,例1:文件瀏覽,組合模式,例1:文件瀏覽 抽象文件類,public abstract class AbstractFile public abstract void add(AbstractFile e); public abstract void remove(AbstractFile e); public abstract void display(); ,組合模式,例1:文件瀏覽 文件夾類,impor
34、t java.util.*; public class Folder extends AbstractFile private ArrayList fileList=new ArrayList(); private String fileName; public Folder (String fileName) this. fileName = fileName; public void add(AbstractFile element) list.add(element); public void delete(AbstractFile element) list.remove(elemen
35、t); public void display() for(Object object:list) (AbstractFile)object).display(); ,組合模式,例1:文件瀏覽 圖片文件類,import java.util.*; public class ImageFile extends AbstractFile private String fileName; public ImageFile (String fileName) this. fileName = fileName; public void add(AbstractFile element) System.o
36、ut.println(不能添加); public void delete(AbstractFile element) System.out.println(不能刪除); public void display() Runtime.getRuntime().exec(photoshop.exe); ,組合模式,例1:文件瀏覽 文本文件類,import java.util.*; public class TextFile extends AbstractFile private String fileName; public TextFile (String fileName) this. fil
37、eName = fileName; public void add(AbstractFile element) System.out.println(不能添加); public void delete(AbstractFile element) System.out.println(不能刪除); public void display() Runtime.getRuntime().exec(notepad.exe); ,組合模式,例1:文件瀏覽 客戶端,public class Client public static void main(String a) AbstractFile file
38、1,file2,file3,folder1,folder2; file1=new ImageFile(); file2=new TextFile(); file3=new VideoFile(); folder1=new Folder(); folder2=new Folder(); folder1.add(file1); folder1.add(file2); folder1.add(folder2); folder2.add(file3); file1.display(); file3.display(); folder1.display(); ,組合模式,模式擴(kuò)展 透明組合模式與安全組合
39、模式 透明組合模式:即葉子結(jié)點(diǎn)與分支結(jié)點(diǎn)結(jié)構(gòu)相同 例1:即為透明組合模式,有什么缺陷?,父子之間不太像,葉子結(jié)點(diǎn)有很多方法是不需要的,處理不當(dāng)有可能引起系統(tǒng)錯(cuò)誤,組合模式,模式擴(kuò)展 透明組合模式與安全組合模式 安全組合模式:葉子結(jié)點(diǎn)與分支結(jié)點(diǎn)結(jié)構(gòu)不同,組合模式,例2:公司組織結(jié)構(gòu),組合模式,例2:公司組織結(jié)構(gòu) 公司抽象類 總的抽象接口 該接口中定義的方法對(duì)葉子還是分支都有效,組合模式,例2:公司組織結(jié)構(gòu) 樹葉接口類 (抽象員工) 樹葉實(shí)現(xiàn)類 (具體員工),組合模式,例2:公司組織結(jié)構(gòu) 分支接口 (抽象經(jīng)理),組合模式,例2:公司組織結(jié)構(gòu) 分支實(shí)現(xiàn) (具體經(jīng)理),組合模式,例2:公司組織結(jié)構(gòu) 客
40、戶端,組合模式,例2:公司組織結(jié)構(gòu) 客戶端,組合模式,例2:公司組織結(jié)構(gòu) 客戶端,組合模式,評(píng)價(jià) 優(yōu)點(diǎn) 可以清楚地定義分層次的復(fù)雜對(duì)象,表示對(duì)象的全部或部分層次,使得增加新構(gòu)件也更容易。 客戶端調(diào)用簡(jiǎn)單,客戶端可以一致的使用組合結(jié)構(gòu)或其中單個(gè)對(duì)象。 定義了包含葉子對(duì)象和容器對(duì)象的類層次結(jié)構(gòu),葉子對(duì)象可以被組合成更復(fù)雜的容器對(duì)象,而這個(gè)容器對(duì)象又可以被組合,這樣不斷遞歸下去,可以形成復(fù)雜的樹形結(jié)構(gòu)。 更容易在組合體內(nèi)加入對(duì)象構(gòu)件,客戶端不必因?yàn)榧尤肓诵碌膶?duì)象構(gòu)件而更改原有代碼。,組合模式,評(píng)價(jià) 缺點(diǎn) 使設(shè)計(jì)變得更加抽象,對(duì)象的業(yè)務(wù)規(guī)則如果很復(fù)雜,則實(shí)現(xiàn)組合模式具有很大挑戰(zhàn)性,而且不是所有的方法都
41、與葉子對(duì)象子類都有關(guān)聯(lián)。 增加新構(gòu)件時(shí)可能會(huì)產(chǎn)生一些問題,很難對(duì)容器中的構(gòu)件類型進(jìn)行限制。,組合模式,評(píng)價(jià) 適用環(huán)境: 需要表示一個(gè)對(duì)象整體或部分層次,在具有整體和部分的層次結(jié)構(gòu)中,希望通過一種方式忽略整體與部分的差異,可以一致地對(duì)待它們。 讓客戶能夠忽略不同對(duì)象層次的變化,客戶端可以針對(duì)抽象構(gòu)件編程,無須關(guān)心對(duì)象層次結(jié)構(gòu)的細(xì)節(jié)。 對(duì)象的結(jié)構(gòu)是動(dòng)態(tài)的并且復(fù)雜程度不一樣,但客戶需要一致地處理它們。 安全組合模式更加可靠,更被推薦使用,組合模式,典型應(yīng)用 文件系統(tǒng):,組合模式,典型應(yīng)用 操作系統(tǒng)中的目錄結(jié)構(gòu)是一個(gè)樹形結(jié)構(gòu),因此在對(duì)文件和文件夾進(jìn)行操作時(shí)可以應(yīng)用組合模式。 例如殺毒軟件在查毒或殺毒時(shí)
42、,既可以針對(duì)一個(gè)具體文件,也可以針對(duì)一個(gè)目錄。如果是對(duì)目錄查毒或殺毒,將遞歸處理目錄中的每一個(gè)子目錄和文件。,組合模式,典型應(yīng)用 XML文檔解析,組合模式,典型應(yīng)用 JDK的AWT/Swing是組合模式在Java類庫(kù)中的一個(gè)典型實(shí)際應(yīng)用。,裝飾模式,意圖 油漆工 美顏相機(jī),裝飾模式,意圖 裝飾 給父母的成績(jī)單 強(qiáng)壯與俯臥撐,裝飾模式,意圖 要點(diǎn):為類或者對(duì)象添加某種行為或功能 實(shí)現(xiàn)方式: 繼承機(jī)制,使用繼承機(jī)制是給現(xiàn)有類添加功能的一種有效途徑,通過繼承一個(gè)現(xiàn)有類可以使得子類在擁有自身方法的同時(shí)還擁有父類的方法。但是這種方法是靜態(tài)的,用戶不能控制增加行為的方式和時(shí)機(jī)。 關(guān)聯(lián)機(jī)制,即將一個(gè)類的對(duì)象
43、嵌入另一個(gè)對(duì)象中,由另一個(gè)對(duì)象來決定是否調(diào)用嵌入對(duì)象的行為以便擴(kuò)展自己的行為,我們稱這個(gè)嵌入的對(duì)象為裝飾器(Decorator)。,裝飾模式,意圖 裝飾模式以對(duì)客戶透明的方式動(dòng)態(tài)地給一個(gè)對(duì)象附加上更多的責(zé)任。 客戶端并不會(huì)覺得對(duì)象在裝飾前和裝飾后有什么不同。 裝飾模式可以在不需要?jiǎng)?chuàng)造更多子類的情況下,將對(duì)象的功能加以擴(kuò)展。,裝飾模式,模式定義 裝飾模式(Decorator Pattern) :動(dòng)態(tài)地給一個(gè)對(duì)象增加一些額外的職責(zé)(Responsibility),就增加對(duì)象功能來說,裝飾模式比生成子類實(shí)現(xiàn)更為靈活。 其別名也可以稱為包裝器(Wrapper),與適配器模式的別名相同,但它們適用于不同
44、的場(chǎng)合。 根據(jù)翻譯的不同,裝飾模式也有人稱之為“油漆工模式” 。,裝飾模式,模式定義 Decorator Pattern: Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. Frequency of use: medium,裝飾模式,模式角色 Component: 抽象構(gòu)件 ConcreteComponent: 具體構(gòu)件 Decorator: 抽象裝飾類
45、 ConcreteDecorator: 具體裝飾類,裝飾模式,模式結(jié)構(gòu),裝飾模式,模式結(jié)構(gòu) 與繼承關(guān)系相比,關(guān)聯(lián)關(guān)系的主要優(yōu)勢(shì)在于不會(huì)破壞類的封裝性,而且繼承是一種耦合度較大的靜態(tài)關(guān)系,無法在程序運(yùn)行時(shí)動(dòng)態(tài)擴(kuò)展。 在軟件開發(fā)階段,關(guān)聯(lián)關(guān)系不會(huì)比繼承關(guān)系減少編碼量,但是到了軟件維護(hù)階段,由于關(guān)聯(lián)關(guān)系使系統(tǒng)具有較好的松耦合性,因此使得系統(tǒng)更加容易維護(hù)。當(dāng)然,關(guān)聯(lián)關(guān)系的缺點(diǎn)是比繼承關(guān)系要?jiǎng)?chuàng)建更多的對(duì)象。 使用裝飾模式來實(shí)現(xiàn)擴(kuò)展比繼承更加靈活,它以對(duì)客戶透明的方式動(dòng)態(tài)地給一個(gè)對(duì)象附加更多的責(zé)任。裝飾模式可以在不需要?jiǎng)?chuàng)造更多子類的情況下,將對(duì)象的功能加以擴(kuò)展。,裝飾模式,模式實(shí)現(xiàn) 典型的抽象裝飾類代碼:
46、,裝飾模式,模式實(shí)現(xiàn) 典型的具體裝飾類代碼:,裝飾模式,例1:變形金剛 變形金剛在變形之前是一輛汽車,它可以在陸地上移動(dòng)。 裝飾: 變機(jī)器人,會(huì)說話 還可以變成飛機(jī)。,裝飾模式,例1:變形金剛,裝飾模式,例1:變形金剛 抽象構(gòu)件類 具體構(gòu)件類,public interface Transform public void move(); ,public final class Car implements Transform public Car() System.out.println(變形金剛是一輛車!); public void move() System.out.println(在陸地上
47、移動(dòng)!); ,裝飾模式,例1:變形金剛 抽象裝飾類,public class Changer implements Transform private Transform transform; public Changer(Transform transform) this.transform=transform; public void move() transform.move(); ,裝飾模式,例1:變形金剛 具體裝飾類1:機(jī)器人,public class Robot extends Changer public Robot(Transform transform) super(tran
48、sform); System.out.println(變成機(jī)器人!); public void say() System.out.println(說話!); ,裝飾模式,例1:變形金剛 具體裝飾類2:飛機(jī),public class Airplane extends Changer public Airplane(Transform transform) super(transform); System.out.println(變成飛機(jī)!); public void fly() System.out.println(在天空飛翔!); ,裝飾模式,例1:變形金剛 客戶端,public class
49、Client public static void main(String args) Transform camaro; camaro=new Car(); camaro.move(); System.out.println(-); Airplane bumblebee=new Airplane(camaro); bumblebee.move();/原有方法 bumblebee.fly();/新增方法 ,裝飾模式,例2:成績(jī)單,裝飾模式,例2:成績(jī)單 抽象構(gòu)件類: SchoolReport,裝飾模式,例2:成績(jī)單 具體構(gòu)件類:FourthGradeSchoolReport,裝飾模式,例2:成
50、績(jī)單 抽象裝飾類:Decorator,裝飾模式,例2:成績(jī)單 具體裝飾類:最高分HighScoreDecorator,裝飾模式,例2:成績(jī)單 具體裝飾類:排名SortDecorator,裝飾模式,例2:成績(jī)單 客戶端:Father,裝飾模式,評(píng)價(jià) 優(yōu)點(diǎn) 裝飾模式與繼承關(guān)系的目的都是要擴(kuò)展對(duì)象的功能,但是裝飾模式可以提供比繼承更多的靈活性。 可以通過一種動(dòng)態(tài)的方式來擴(kuò)展一個(gè)對(duì)象的功能,通過配置文件可以在運(yùn)行時(shí)選擇不同的裝飾器,從而實(shí)現(xiàn)不同的行為。 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創(chuàng)造出很多不同行為的組合??梢允褂枚鄠€(gè)具體裝飾類來裝飾同一對(duì)象,得到功能更為強(qiáng)大的對(duì)象。 具體構(gòu)
51、件類與具體裝飾類可以獨(dú)立變化,用戶可以根據(jù)需要增加新的具體構(gòu)件類和具體裝飾類,在使用時(shí)再對(duì)其進(jìn)行組合,原有代碼無須改變,符合“開閉原則”。,裝飾模式,評(píng)價(jià) 缺點(diǎn) 系統(tǒng)結(jié)構(gòu)復(fù)雜而繁瑣 使用裝飾模式進(jìn)行系統(tǒng)設(shè)計(jì)時(shí)將產(chǎn)生很多小對(duì)象,這些對(duì)象的區(qū)別在于它們之間相互連接的方式有所不同,而不是它們的類或者屬性值有所不同,同時(shí)還將產(chǎn)生很多具體裝飾類。這些裝飾類和小對(duì)象的產(chǎn)生將增加系統(tǒng)的復(fù)雜度,加大學(xué)習(xí)與理解的難度。 這種比繼承更加靈活機(jī)動(dòng)的特性,也同時(shí)意味著裝飾模式比繼承更加易于出錯(cuò),排錯(cuò)也很困難,對(duì)于多次裝飾的對(duì)象,調(diào)試時(shí)尋找錯(cuò)誤可能需要逐級(jí)排查,較為繁瑣。,裝飾模式,評(píng)價(jià) 適用環(huán)境: 在不影響其他對(duì)象的
52、情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加職責(zé)。 需要?jiǎng)討B(tài)地給某一個(gè)對(duì)象增加功能,這些功能也可以動(dòng)態(tài)地被撤銷 當(dāng)不能采用繼承的方式對(duì)系統(tǒng)進(jìn)行擴(kuò)充或者采用繼承不利于系統(tǒng)擴(kuò)展和維護(hù)時(shí)。不能采用繼承的情況主要有兩類:第一類是系統(tǒng)中存在大量獨(dú)立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長(zhǎng);第二類是因?yàn)轭惗x不能繼承(如final類)。,裝飾模式,典型應(yīng)用 在javax.swing包中,通過裝飾模式動(dòng)態(tài)給一些構(gòu)件增加新的行為或改善其外觀顯示。 如JList構(gòu)件本身并不支持直接滾動(dòng),即沒有滾動(dòng)條,要?jiǎng)?chuàng)建可以滾動(dòng)的列表,可以使用如下代碼實(shí)現(xiàn):,裝飾模式,典型應(yīng)用 裝飾模式在JDK中最經(jīng)典
53、的實(shí)例是Java IO。 以InputStream為例:,裝飾模式,模式擴(kuò)展 裝飾模式的簡(jiǎn)化,裝飾模式,擴(kuò)展 裝飾模式的簡(jiǎn)化-需要注意的問題 一個(gè)裝飾類的接口必須與被裝飾類的接口保持相同,對(duì)于客戶端來說無論是裝飾之前的對(duì)象還是裝飾之后的對(duì)象都可以一致對(duì)待。 盡量保持具體構(gòu)件類Component作為一個(gè)“輕”類,也就是說不要把太多的邏輯和狀態(tài)放在具體構(gòu)件類中,可以通過裝飾類對(duì)其進(jìn)行擴(kuò)展。 如果只有一個(gè)具體構(gòu)件類而沒有抽象構(gòu)件類,那么抽象裝飾類可以作為具體構(gòu)件類的直接子類。,裝飾模式,擴(kuò)展 透明裝飾模式(成績(jī)單) 在透明裝飾模式中,要求客戶端完全針對(duì)抽象編程,裝飾模式的透明性要求客戶端程序不應(yīng)該聲
54、明具體構(gòu)件類型和具體裝飾類型,而應(yīng)該全部聲明為抽象構(gòu)件類型。,裝飾模式,模式擴(kuò)展 半透明裝飾模式(變形金剛) 大多數(shù)裝飾模式都是半透明(semi-transparent)的裝飾模式,而不是完全透明(transparent)的。即允許用戶在客戶端聲明具體裝飾者類型的對(duì)象,調(diào)用在具體裝飾者中新增的方法。,外觀模式,意圖,外觀模式,意圖,外觀模式,意圖 軟件開發(fā)過程中,程序經(jīng)常會(huì)越做越大,各種系統(tǒng)、子系統(tǒng)之間的關(guān)系會(huì)越來越錯(cuò)綜復(fù)雜。過多的耦合關(guān)系使得系統(tǒng)難以維護(hù)和擴(kuò)展,一旦面對(duì)變化的需求,就需要修改大量的代碼 外觀模式正是基于這樣的原因產(chǎn)生的,主要是積極的應(yīng)對(duì)變化,盡可能減少需求變化的影響,外觀模式
55、,意圖 未使用外觀模式的系統(tǒng) 隨著復(fù)雜度的增加,外觀模式,意圖 引入外觀角色之后,用戶只需要直接與外觀角色交互,用戶與子系統(tǒng)之間的復(fù)雜關(guān)系由外觀角色來實(shí)現(xiàn),從而降低了系統(tǒng)的耦合度。,外觀模式,模式定義 外觀模式(Facade Pattern):外部與一個(gè)子系統(tǒng)的通信必須通過一個(gè)統(tǒng)一的外觀對(duì)象進(jìn)行,為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,外觀模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。 外觀模式又翻譯為門面模式,它是一種對(duì)象結(jié)構(gòu)型模式。,外觀模式,模式定義 Facade Pattern: Provide a unified interface to a set of interf
56、aces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use. Frequency of use: high,外觀模式,角色: Facade: 外觀角色 SubSystem:子系統(tǒng)角色,外觀模式,模式結(jié)構(gòu),外觀模式,模式結(jié)構(gòu) 根據(jù)“單一職責(zé)原則”,在軟件中將一個(gè)系統(tǒng)劃分為若干個(gè)子系統(tǒng)有利于降低整個(gè)系統(tǒng)的復(fù)雜性,一個(gè)常見的設(shè)計(jì)目標(biāo)是使子系統(tǒng)間的通信和相互依賴關(guān)系達(dá)到最小,而達(dá)到該目標(biāo)的途徑之一就是引入一個(gè)外觀對(duì)象,它為子系統(tǒng)的訪問提供了一個(gè)簡(jiǎn)單而單一的入口。
57、外觀模式也是“迪米特法則”的體現(xiàn),通過引入一個(gè)新的外觀類可以降低原有系統(tǒng)的復(fù)雜度,同時(shí)降低客戶類與子系統(tǒng)類的耦合度。,外觀模式,模式結(jié)構(gòu) 外觀模式要求一個(gè)子系統(tǒng)的外部與其內(nèi)部的通信通過一個(gè)統(tǒng)一的外觀對(duì)象進(jìn)行,外觀類將客戶端與子系統(tǒng)的內(nèi)部復(fù)雜性分隔開,使得客戶端只需要與外觀對(duì)象打交道,而不需要與子系統(tǒng)內(nèi)部的很多對(duì)象打交道。 外觀模式的目的在于降低系統(tǒng)的復(fù)雜程度。 外觀模式從很大程度上提高了客戶端使用的便捷性,使得客戶端無須關(guān)心子系統(tǒng)的工作細(xì)節(jié),通過外觀角色即可調(diào)用相關(guān)功能。,外觀模式,模式實(shí)現(xiàn) 典型的外觀角色代碼:,外觀模式,例1:電源總開關(guān) 現(xiàn)在考察一個(gè)電源總開關(guān)的例子,以便進(jìn)一步說明外觀模式
58、。為了使用方便,一個(gè)電源總開關(guān)可以控制四盞燈、一個(gè)風(fēng)扇、一臺(tái)空調(diào)和一臺(tái)電視機(jī)的啟動(dòng)和關(guān)閉。通過該電源總開關(guān)可以同時(shí)控制上述所有電器設(shè)備,使用外觀模式設(shè)計(jì)該系統(tǒng)。,外觀模式,例1:電源總開關(guān),外觀模式,例1:電源總開關(guān) 子系統(tǒng)角色類:空調(diào),public class AirConditioner public void on() System.out.println(空調(diào)打開!); public void off() System.out.println(空調(diào)關(guān)閉!); ,外觀模式,例1:電源總開關(guān) 子系統(tǒng)角色類:電視,public class Television public void on(
59、) System.out.println(電視機(jī)打開!); public void off() System.out.println(電視機(jī)關(guān)閉!); ,外觀模式,例1:電源總開關(guān) 子系統(tǒng)角色類:風(fēng)扇,public class Fan public void on() System.out.println(風(fēng)扇打開!); public void off() System.out.println(風(fēng)扇關(guān)閉!); ,外觀模式,例1:電源總開關(guān) 子系統(tǒng)角色類:電燈,public class Light private String position; public Light(String position) this.position=position; public void on() System.out.println(this.position + 燈打開!); public void off() System.out.println(this.position + 燈關(guān)閉!); ,外觀模式,例1:電源總開關(guān) 外觀角色類:總開關(guān),public class Ge
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45169-2025增材制造金屬制件殘余應(yīng)力聲束控制法
- GB/T 45142-2025海洋溢油污染生態(tài)修復(fù)監(jiān)測(cè)和效果評(píng)估技術(shù)指南
- GB/T 45221-2025化學(xué)品EASZY試驗(yàn)利用轉(zhuǎn)基因tg(cyp19a1b:GFP)斑馬魚胚胎通過雌激素受體檢測(cè)內(nèi)分泌活性物質(zhì)
- 鄉(xiāng)村地基出售合同范本
- 2025年鐵嶺考貨運(yùn)從業(yè)資格證
- 2025年永州貨運(yùn)從業(yè)資格證怎么考試
- 加工合同范本道客
- 買車庫(kù)出售合同范本
- it購(gòu)銷合同范本
- 醫(yī)院業(yè)務(wù)合同范本
- 經(jīng)濟(jì)法學(xué)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 浙江寧波前灣控股集團(tuán)有限公司招聘筆試題庫(kù)2024
- 結(jié)構(gòu)化學(xué)(PDF電子書)
- 產(chǎn)科腹部四步觸診要點(diǎn)
- 第10課 人類社會(huì)及其發(fā)展規(guī)律-【中職專用】2024年中職思想政治《哲學(xué)與人生》金牌課件(高教版2023·基礎(chǔ)模塊)
- SLT 478-2021 水利數(shù)據(jù)庫(kù)表結(jié)構(gòu)及標(biāo)識(shí)符編制總則
- 2024年春學(xué)期人教版小學(xué)道德與法治六年級(jí)下冊(cè)教學(xué)計(jì)劃附教學(xué)進(jìn)度表
- 深度學(xué)習(xí)視角下“尺規(guī)作圖”教學(xué)策略
- 2024 年袋鼠數(shù)學(xué)競(jìng)賽 等級(jí)E(中國(guó)區(qū))
- 2024年南京旅游職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)匯編
- 2024-2030中國(guó)半導(dǎo)體閥門及管接頭市場(chǎng)現(xiàn)狀研究分析與發(fā)展前景預(yù)測(cè)報(bào)告
評(píng)論
0/150
提交評(píng)論