一:使用場(chǎng)景
1)使用的地方:我想使用兩個(gè)不同類的方法,這個(gè)時(shí)候你需要把它們組合起來(lái)使用
2)目前使用的情況:我會(huì)把兩個(gè)類用戶組合的方式放到一起,編程思想think in java里已經(jīng)提到個(gè),能盡量用組合就用組合,繼承一般考慮再后。
3)使用后的好處:你不需要改動(dòng)以前的代碼,只是新封裝了一新類,由這個(gè)類來(lái)提供兩個(gè)類的方法,這個(gè)時(shí)候:一定會(huì)想到facade外觀模式,本來(lái)是多個(gè)類使用的情況,我新封裝成一個(gè)類來(lái)使用,而這個(gè)類我采用組合的方式來(lái)包裝新的方法。我的理解是,設(shè)計(jì)模式本身就是為了幫助解決特定的業(yè)務(wù)場(chǎng)景而故意把模式劃分對(duì)應(yīng)的模式類別,其實(shí)大多數(shù)情況,都解決了同樣的問(wèn)題,這個(gè)時(shí)候其實(shí)沒(méi)有必要過(guò)多的糾纏到模式的名字上了,你有好的注意,你甚至取一個(gè)新的名字來(lái)概括這樣的使用場(chǎng)景。
4)使用的壞處:適配器模式,有兩種方式來(lái)實(shí)現(xiàn)。一個(gè)是組合一個(gè)是繼承,我覺(jué)得,首先應(yīng)該考慮組合,能用組合就不要用繼承,這是第一個(gè)。第二個(gè),你采用繼承來(lái)實(shí)現(xiàn),那肯定會(huì)加大繼承樹(shù)結(jié)構(gòu),如果你的繼承關(guān)系本身就很復(fù)雜了,這肯定會(huì)加大繼承關(guān)系的維護(hù),不有利于代碼的理解,或則更加繁瑣。繼承是為了解決重用的為題而出現(xiàn)的,所以我覺(jué)得不應(yīng)該濫用繼承,有機(jī)會(huì)可以考慮同樣別的方案。
二:一個(gè)實(shí)際的例子
關(guān)聯(lián)營(yíng)銷的例子,用戶購(gòu)買完商品后,我又推薦他相關(guān)別的商品
由于減少代碼,方法我都不采用接口,直接由類來(lái)提供,代碼只是一個(gè)范例而已,都精簡(jiǎn)了。
1)創(chuàng)建訂單信息
public class Order {
private Long orderId;
private String nickName;
public Order(Long orderId,String nickName){
this.orderId=orderId;
this.nickName=nickName;
}
/**
* 用戶下訂單
*/
public void insertOrder(){
}
}
2)商品信息
public class Auction {
/**商品名稱*/
private String name;
/**制造商*/
private String company;
/**制造日期*/
private Date date;
public Auction(String name,String company, Date date){
this.name=name;
this.company=company;
this.date=date;
}
/**
* 推廣的商品列表
*/
public void commendAuction(){
}
}
3)購(gòu)物
public class Trade {
/**用戶訂單*/
private Order order;
/**商品信息*/
private Auction auction;
public Trade(Order order ,Auction auction){
this.order=order;
this.auction=auction;
}
/**
* 用戶產(chǎn)生訂單以及后續(xù)的事情
*/
public void trade(){
/**下訂單*/
order.insertOrder();
/**關(guān)聯(lián)推薦相關(guān)的商品*/
auction.commendAuction();
}
}
4)使用心得:其實(shí)外面采用了很多繼承的方式,order繼承auction之后,利用super .inserOrder()再加一個(gè)auction.recommendAuction(),實(shí)際上大同小異,我到覺(jué)得采用組合更容易理解以及代碼更加優(yōu)美點(diǎn)。