利用觀察者模式,寫遵守開閉原則,單一職責的代碼

設計模式設計原則,如果作爲開發人員的話,其實這些並不遙遠。

我們要用設計原則嚴以律己,要用設計模式增人玫瑰,即使你走了,留下的代碼依舊萬古流傳!

如果捧一本書,我覺得百分之九十的人,都認識裏邊的字,但是,好好看看,那是人說的話麼?

 

# # 簡單介紹一下開閉原則

   一句話介紹,就是你寫完這段代碼以後,就永遠別來改它。即使業務需要擴展,你也不能再來改它了。只要你能做到這一點,那就遵守了開閉原則。

  爲什麼要遵守這個原則呢?就是在面對一些大量的代碼的時候,如果你去在裏邊改動,你很難保證一定不會該出來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);
	}
}

 

測試結果
 

 

# # 疑問

 細心的同學會發現,事件的順序並不是我們想的那樣。這裏的,我們一般想要讓它按照我們指定的順序執行。

 這裏的問題還沒弄清楚

 

# # 還有一個問題,就是監聽者執行失敗了怎麼辦

 希望有懂的朋友不吝賜教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章