設計模式的學習
很多同學都是通過閱讀些書來學習設計模式,學習各種模式的代碼結構或一些不切實際的實用場景,很快忘記,或理解不夠,在工作中誤用或濫用。
下面我總結了一個很學習設計模式的方法。
重點
設計模式的主要思想其實很簡單,就是:測試驅動開發。測試先行。意思是:先寫測試代碼,再去實現代碼。
所以先寫單元測試是很重要的,因為選用什么設計模式,不是容易就決定的。還是根據業務場景去決定的。而且業務需求隨時都變
化。所以你的代碼要經受得住各種變化。設計模式跟着需求變化而變化。這就是XP的關鍵,擁抱變化。那如何確保每次修改后代碼
能穩定地運行呢?那就行寫好單元測試。盡量覆蓋盡量多的測試用例,每次修改完跑一下單元測試。不用管要用什么設計模式。只
要你的代碼都能通過,你的代碼肯定用了很多設計模式在里面,不然不可能做到擁抱變化(就是解耦)。設計模式的目標就是擁抱變化。
代碼示例
如果你不知道什么叫工廠模式。請跑下面單元測試代碼,確保此測試代碼能通過,說明你已經掌握工廠模式了。
public class PatternDemo {
@Test
/**
* 工廠模式單元測試
*/
public void testShapeFactory() {
ShapeFactory shapeFactory = new ShapeFactory();
//獲取 Circle 的對象,並調用它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
//Shape 是否接口,因為不是接口也可以,類或抽象類也可以實現這樣的效果。這樣違反了依賴倒置的原則。
//行為的抽象選擇依賴接口而非類或抽象類。
//下面判斷是否為接口。
//寫單元測試時是不用寫這個測試的。
final boolean isInterface = Shape.class.isInterface();
Assert.assertEquals(true, isInterface);
//調用 Circle 的 draw 方法
String returnStr = shape1.getDrawStr();
Assert.assertEquals("Inside Circle::draw() method.", returnStr);
//獲取 Rectangle 的對象,並調用它的 draw 方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
//調用 Rectangle 的 draw 方法
returnStr = shape2.getDrawStr();
Assert.assertEquals("Inside Rectangle::draw() method.", returnStr);
//獲取 Square 的對象,並調用它的 draw 方法
Shape shape3 = shapeFactory.getShape("SQUARE");
//調用 Square 的 draw 方法
returnStr = shape3.getDrawStr();
Assert.assertEquals("Inside Square::draw() method.", returnStr);
}
}