設計模式設計原則,如果作爲開發人員的話,其實這些並不遙遠。
我們要用設計原則嚴以律己,要用設計模式增人玫瑰,即使你走了,留下的代碼依舊萬古流傳!
如果捧一本書,我覺得百分之九十的人,都認識裏邊的字,但是,好好看看,那是人說的話麼?
# # 簡單介紹一下開閉原則
一句話介紹,就是你寫完這段代碼以後,就永遠別來改它。即使業務需要擴展,你也不能再來改它了。只要你能做到這一點,那就遵守了開閉原則。
爲什麼要遵守這個原則呢?就是在面對一些大量的代碼的時候,如果你去在裏邊改動,你很難保證一定不會該出來bug。舉個簡單的例子,一團電線,很多密密麻麻的纏繞在一起,讓你改其中一根線,你試試看。
# # 單一職責原則
這個是最好用的,又是最難用的。
用一句話介紹,一個方法裏邊,最好只做一件事,一個類裏邊最好只做一類事。剛開始開發,很可能,做的工作就是堆代碼。自己堆一堆,然後最後自己都不知道在寫的什麼了。
單一職責,就是要我們在代碼中劃清楚河漢界。
# # 怎麼使用觀察者模式完美的遵守開閉原則和單一職責原則
這裏舉一個簡單的例子,比方說我們下訂單,下完訂單還有發短信通知,有可能還要發送郵件通知,以後可能還要發送微信通知。
上邊的代碼是多數人會這樣寫的方式,做的好一點的,會將八百行代碼做抽取不至於將這一千多行代碼混在一起。即使這樣,仍然違背了但一職責原則。今後但凡是做任何擴展,都違背了開閉原則。
那就這個需求而言,我應該怎麼寫代碼呢?那就是使用觀察者模式,也叫觀察者模式,使用事件驅動。
再看一下正確的寫法:
代碼結構:以後需要擴展的時候,只需要在這個下邊添加 監聽者就可以了。
OrderEvent 的代碼
import org.springframework.context.ApplicationEvent;
/**
* @author angus
* @create 2020-03-17 8:41
*/
public class OrderEvent extends ApplicationEvent {
/**
* Create a new ApplicationEvent.
*
* @param source the object on which the event initially occurred (never {@code null})
*/
public OrderEvent(Object source) {
super(source);
}
}
一個發送短信通知的監聽者代碼: OrderSendMesListener
這個地方一定要注意 要加 @Component 註解
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
/**
* @author angus
* @create 2020-03-17 8:43
*/
@Component
public class OrderSendMesListener implements ApplicationListener<OrderEvent> {
@Override
public void onApplicationEvent(OrderEvent event) {
//發送短信通知操作
System.out.println("發送短信通知,代碼三百行");
}
}
另外一個發送郵件的代碼同上。
主類 OrderService 的代碼
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
/**
* @author angus
* @create 2020-03-17 8:32
*/
@Service
public class OrderService {
@Autowired
ApplicationContext applicationContext;
public void saveOrder(){
//1.創建訂單
System.out.println("創建訂單邏輯,代碼八百行");
OrderEvent event = new OrderEvent("參數");
applicationContext.publishEvent(event);
}
}
測試結果
# # 疑問
細心的同學會發現,事件的順序並不是我們想的那樣。這裏的,我們一般想要讓它按照我們指定的順序執行。
這裏的問題還沒弄清楚
# # 還有一個問題,就是監聽者執行失敗了怎麼辦
希望有懂的朋友不吝賜教