第173章

大B:“假設現在要設計一個販賣各類書籍的電子商務網站的購物車(ShoppingCat)系統。一個最簡單的情況就是把所有貨品的單價乘上數量,但是實際情況肯定比這要複雜。”

小A:“一般會有哪些情況哩?”

大B:“比如:1、可能對所有的兒童類圖書實行每本一元的折扣;2、計算機類圖書提供每本7%的促銷折扣,而對電子類圖書有3%的折扣;3、剩餘的圖書沒有折扣。4、還會有新的打折策略。由於有這樣複雜的折扣算法,使得價格計算問題需要系統地解決。”

方案一:業務邏輯放在各具體子類

/**//*

*各子類實現銷售價格算法

*/

publicabstractclassBook……{

privatedoubleprice;

privateStringname;

publicStringgetName()……{

returnname;

}

publicvoidsetName(Stringname)……{

this.name=name;

}

publicdoublegetPrice()……{

returnprice;

}

publicvoidsetPrice(doubleprice)……{

this.price=price;

}

publicabstractdoublegetSalePrice();

}

publicclassCsBookextendsBook……{

publicCsBook(Stringname,doubleprice)

{

this.setName(name);

this.setPrice(price);

}

publicdoublegetSalePrice()

……{

returnthis.getPrice()*0.93;

}

}

publicclassChildrenBookextendsBook……{

publicChildrenBook(Stringname,doubleprice)……{

this.setName(name);

this.setPrice(price);

}

publicdoublegetSalePrice()……{

returnthis.getPrice()-1;

}

}

publicclassClient……{

publicstaticvoidmain(Stringargs[])

……{

BookcsBook1=newCsBook(“Thinkinjava”,45);

BookchildrenBook1=newChildrenBook(“Hello”,20);

System.out.println(csBook1.getName()+:+csBook1.getSalePrice());

System.out.println(childrenBook1.getName()+:+childrenBook1.getSalePrice());

}

}

問題:每個子類必須都各自實現打折算法,即使打折算法相同。所以codereuse不好

方案二:

//把打折策略代碼提到父類來實現codereuse

publicabstractclassBook……{

privatedoubleprice;

privateStringname;

publicStringgetName()……{

returnname;

}

publicvoidsetName(Stringname)……{

this.name=name;

}

publicdoublegetPrice()……{

returnprice;

}

publicvoidsetPrice(doubleprice)……{

this.price=price;

}

//銷售價格

publicstaticdoubletoSalePrice(Bookbook)

……{

if(bookinstanceofChildrenBook)

……{

returnbook.getPrice()-1;

}

elseif(bookinstanceofCsBook)

……{

returnbook.getPrice()*0.93;

}

return0;

}

}

publicclassClient……{

publicstaticvoidmain(Stringargs[])

……{

BookcsBook1=newCsBook(“Thinkinjava”,45);

BookchildrenBook1=newChildrenBook(“Hello”,20);

System.out.println(csBook1.getName()+:+Book.toSalePrice(csBook1));

System.out.println(childrenBook1.getName()+:+Book.toSalePrice(childrenBook1));

}

}

toSalePrice方法是比較容易change的地方,如果策略複雜用if判斷比較亂,並且策略修改或增加時需改變原代碼。

方案三:策略模式

codereuse時最好用合成(HAS-A)而不用(IS-A),更加靈活。

publicabstractclassBook……{

privatedoubleprice;

privateStringname;

privateDiscountStrategydiscountStrategy;//折扣策略

publicStringgetName()……{

returnname;

}

publicvoidsetName(Stringname)……{

this.name=name;

}

publicdoublegetPrice()……{

returnprice;

}

publicvoidsetPrice(doubleprice)……{

this.price=price;

}

publicDiscountStrategygetDiscountStrategy()……{

returndiscountStrategy;

}

第55章第158章第193章第111章第167章第92章第215章第115章第130章第159章第155章第40章第190章第71章第71章第28章第223章第209章第222章第40章第224章第14章第181章第198章第128章第178章第183章第55章第144章第213章第38章第97章第55章第30章第14章第128章第194章第30章第190章第62章第130章第7章第66章第22章第124章第135章第56章第98章第113章第62章第149章第178章第69章第109章第11章第152章第182章第1章第216章第164章第220章第81章第4章第11章第224章第42章第73章第108章第208章第22章第169章第23章第72章第101章第54章第149章第224章第107章第23章第132章第179章第152章第55章第59章第210章第6章第228章第198章第228章第205章第165章第99章第83章第33章第74章第111章第185章第29章第224章第143章
第55章第158章第193章第111章第167章第92章第215章第115章第130章第159章第155章第40章第190章第71章第71章第28章第223章第209章第222章第40章第224章第14章第181章第198章第128章第178章第183章第55章第144章第213章第38章第97章第55章第30章第14章第128章第194章第30章第190章第62章第130章第7章第66章第22章第124章第135章第56章第98章第113章第62章第149章第178章第69章第109章第11章第152章第182章第1章第216章第164章第220章第81章第4章第11章第224章第42章第73章第108章第208章第22章第169章第23章第72章第101章第54章第149章第224章第107章第23章第132章第179章第152章第55章第59章第210章第6章第228章第198章第228章第205章第165章第99章第83章第33章第74章第111章第185章第29章第224章第143章