因?yàn)槎鄳B(tài)的特性,父類或者接口的引用是可以接受子類對(duì)象的。 比如:
專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)師宗免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
interface Test{}
class Test1 implements Test{}
class Test2 implements Test{}
上面聲明一個(gè)Test接口,兩個(gè)類Test1和Test2,分別實(shí)現(xiàn)Test接口。
表現(xiàn)耦合低的意思是說(shuō),刪除調(diào)用層與接受層無(wú)關(guān),比如:有這樣一個(gè)方法可以這樣設(shè)置參數(shù)類型
void say(Test test){System.out.println("");}
然后調(diào)用時(shí)可以這樣傳參數(shù)
Test1 t1 = new Test1();
Test2 t2 = new Test2():
say(t1); 或 say(t2);
這就是降低耦合,say方法只需要接口類型,具體傳入哪個(gè)對(duì)象是無(wú)需關(guān)注的,因?yàn)榻涌谑且环N規(guī)則,say方法進(jìn)來(lái)的參數(shù)一定是實(shí)現(xiàn)Test接口類的對(duì)象。即使有一天將Test1與Test2兩個(gè)類刪除,Test接口還在,那么say方法就有用,并且隨意擴(kuò)展一個(gè)新的類來(lái)實(shí)現(xiàn)Test接口,這叫做向后兼容。
簡(jiǎn)單問(wèn)題復(fù)雜化了。
線程池,本身有任務(wù)隊(duì)列;
還要用到數(shù)據(jù)隊(duì)列;
兩把鎖;
一把數(shù)據(jù)鎖就解決的問(wèn)題。
自己構(gòu)建一個(gè)blockingqueue,注入到m個(gè)生產(chǎn)者線程及n個(gè)消費(fèi)者線程中;
生產(chǎn)者線程不停的生產(chǎn),往queue里put(),如果隊(duì)列隊(duì)列滿了,線程wait掛起;
消費(fèi)者線程不停的消費(fèi),從queue里take(),如過(guò)隊(duì)列空了,線程自動(dòng)掛起;
BlockingQueueT queue = new ArrayBlockingQueueT(1000);
for(int i=0;i5;i++)
new ConsumerThread(queue).start();
for(int i=0;i10;i++)
new ProducerThread(queue).start();
代碼耦合:一個(gè)軟件結(jié)構(gòu)內(nèi)不同模塊之間互連程度的度量(耦合性也叫塊間聯(lián)系。指軟件系統(tǒng)結(jié)構(gòu)中各模塊間相互聯(lián)系緊密程度的一種度量。模塊之間聯(lián)系越緊密,其耦合性就越強(qiáng),模塊的獨(dú)立性則越差,模塊間耦合的高低取決于模塊間接口的復(fù)雜性,調(diào)用的方式以及傳遞的信息。)
軟件工程規(guī)定寫(xiě)代碼的原則是“高內(nèi)聚,低耦合”。內(nèi)聚是代碼塊間的獨(dú)立性,耦合是各個(gè)代碼塊間的聯(lián)系。
對(duì)于低耦合,粗淺的理解是:一個(gè)完整的系統(tǒng),模塊與模塊之間,盡可能的使其獨(dú)立存在。也就是說(shuō),讓每個(gè)模塊,盡可能的獨(dú)立完成某個(gè)特定的子功能。模塊與模塊之間的接口,盡量的少而簡(jiǎn)單。
代碼內(nèi)聚就是一個(gè)模塊內(nèi)各個(gè)元素彼此結(jié)合的緊密程度,高內(nèi)聚就是一個(gè)模塊內(nèi)各個(gè)元素彼此結(jié)合的緊密程度高。所謂高內(nèi)聚是指一個(gè)軟件模塊是由相關(guān)性很強(qiáng)的代碼組成,只負(fù)責(zé)一項(xiàng)任務(wù),也就是常說(shuō)的單一責(zé)任原則。
高內(nèi)聚,低耦合的系統(tǒng)有什么好處呢?事實(shí)上,短期來(lái)看,并沒(méi)有很明顯的好處,甚至短期內(nèi)會(huì)影響系統(tǒng)的開(kāi)發(fā)進(jìn)度,因?yàn)楦邇?nèi)聚,低耦合的系統(tǒng)對(duì)開(kāi)發(fā)設(shè)計(jì)人員提出了更高的要求。長(zhǎng)期來(lái)看,低耦合的模塊便于進(jìn)行單元測(cè)試,且便于維護(hù)。
舉例:
在java中,你想在你的程序中調(diào)用某個(gè)類比如說(shuō)是A1,如果你在程序中直接new A1(),這樣就寫(xiě)死了。如過(guò)下次業(yè)務(wù)邏輯有變化,你就必須重新修改A1類的代碼。在這種情況下,如果A1類被其他的程序調(diào)用,你修改了A1類的代碼,可能會(huì)對(duì)其他程序造成影響。
但是如果你在配置文件里配置你要用到的類的相關(guān)屬性,通過(guò)程序動(dòng)態(tài)地區(qū)獲得,你只用修改這個(gè)配置文件,把他指向另一個(gè)類A2就行了。用A2替代A1。這就是低耦合,也是java的面向增加開(kāi)放,面向修改關(guān)閉的原則。
程序的耦合度是 你的子程序之間的相關(guān)聯(lián)性,也就是說(shuō)你的多個(gè)類的聯(lián)系 是否太緊密,打個(gè)比方,你房子里邊有窗子 ,那房子 和窗子 就有了關(guān)聯(lián)
耦合度 是松還是緊 就看你的 關(guān)聯(lián) 是強(qiáng)還是弱,也就是修改的代價(jià),比如 你窗子是扣死在墻里的 那么你修改窗子 就必須修改墻 這就比較緊密了,但是如果你窗子是按照某種規(guī)格的 可以自由拆裝的 那么修改的代價(jià)就小,耦合度也就低了
我們寫(xiě)程序的目標(biāo)就是 高內(nèi)聚 低耦合!
這樣修改起來(lái) 就不會(huì)有太多的聯(lián)系 不用 改一個(gè)地方 其他的都要修改
高內(nèi)聚,是指讓一個(gè)類或者一個(gè)方法讓他專注去做一件事情。低耦合:這個(gè)又要求對(duì)象,類之間減少耦合性,更通俗的說(shuō)比如你一個(gè)類的方法引用了很多的別的類,而你是直接new出來(lái)的,這樣就會(huì)出現(xiàn),你修改某個(gè)類之后,這個(gè)方法就會(huì)出現(xiàn)異常錯(cuò)誤。
盡最大程度的降低程序的耦合性可以是程序具備良好的擴(kuò)展性,易于修改。
較為具體的說(shuō)明就是有的時(shí)候程序需要修改,我只需要改正一部分,單是如果程序的耦合性很強(qiáng)的話就需要從頭再寫(xiě)一遍很不劃算,而正常的開(kāi)發(fā)中都是改那部分,重寫(xiě)那部分,把配置文件一改就成了,java中通過(guò)接口(interface),spring技術(shù)中的ioc等實(shí)現(xiàn)的解耦合