依賴倒轉原則與合成復用原則
在一畫圖軟件中提供了多種大小不同的畫筆,並且可以給畫筆指定不同的顏色,某設計人員對畫筆進行了如上圖所示的設計。通過分析,可以發現增加畫筆的種類和顏色會使得系統中類的數目急劇增加,請根據合成復用原則和依賴倒轉原則對上述設計進行重構。
依賴倒轉原則:程序要依賴於抽象接口,不要依賴於具體實現。簡單的說就是要求對抽象進行編程,不要對實現進行編程,這樣就降低了客戶與實現模塊間的耦合。
合成復用原則:它要求在軟件復用時,要盡量先使用組合或者聚合等關聯關系來實現,其次才考慮使用繼承關系來實現
重構后的類圖:
依賴倒轉原則與合成復用原則:利用合成復用原則與依賴倒轉原則,根據Pen的大小與顏色編寫兩個抽象類Size與Color;底層具體類extends抽象類(泛化關系),高層Pen類由Size與Color聚合而來(聚合關系);
代碼實現:
型號抽象類
public abstract class Size { public abstract void sizePen(); }
具體型號類
public class SmallPen extends Size{ //小型 public void sizePen() { System.out.println("小型"); } } public class MiddlePen extends Size{ //中型 public void sizePen() { System.out.println("中型"); } } public class BigPen extends Size{ //大型 public void sizePen() { System.out.println("大型"); } }
顏色抽象類
public abstract class Color { public abstract void colorPen(); }
具體顏色類
public class GreenPen extends Color{ public void colorPen() { System.out.println("綠色"); } }
public class RedPen extends Color{
public void colorPen() {
System.out.println("紅色");
}
}
鋼筆
public class Pen { //鋼筆 private Size size; private Color color; public Size getSize() { return size; } public void setSize(Size size) { this.size = size; } public Color getColor() { return color; } public void setColor(Color color) { this.color = color; } }
聚合鋼筆
public class MianClass { public static void main(String[] args) { //顏色大小隨意組合 Pen pen=new Pen(); //組合小型紅色鋼筆 pen.setSize(new SmallPen()); pen.setColor(new RedPen()); //組合大型綠色鋼筆 pen.setSize(new BigPen()); pen.setColor(new GreenPen()); } }