DIY迷你郵件客戶端的開發結束了,如今徹底能夠Shift+Delete掉這個工程了。享受這個過程已經完整的進行完了,剩下的問題應該算是總結這個工程。java
在 DIY迷你郵件客戶端開發手記(一)中已經很勇敢的面對了失敗的開始,而後在很差的開端下進行一步一步的修正,過程很慘,結果呢?開始的激動全沒有了,剩下最後這兩篇文字和在一大堆代碼中被狂砍剩下來的幾十代碼。服務器
在DIY迷你郵件客戶端開發手記(二)總結和思考了關於「一」中提到的幾個問題。生活和工做中沒有若是,發生了就該面對,重讀《編碼匠藝》,消除沒必要要的若是,珍惜碎屑時間,換取和MM的共度的美好時光,苦逼真是自找的啦。ide
1. 關於測試和實驗學習
實驗: 常常會面臨一個問題就是要實現某一功能,可是有不肯定可否一次性就可以實現,這時候就得停下腳步,作一些較爲簡單的例子,進行技術上的實驗,經過的簡單的實驗能夠節省時間,而且有利於技術的確認,加強開發信心。測試
測試:測試應該是伴隨整個開發過程的,並且很是有必要將測試深刻,嚴格的***到咱們的開發過程當中去。每個模塊就要存在相關的測試代碼,而且確保已經完成的部分可以直接做爲成品集成到項目中。this
體會:保留測試代碼有利於複查和實時測試編碼
2.提取共同,抽象業務spa
面向對象的聖經但是絮叨的像祥林嫂同樣被唸叨,然而不正真感覺抽象的重要性,是很難懂得其中的智慧。設計
PS:在起初設計這個郵件發送的時候一樣使用了策略模式,但是最後發現不是這麼回事,由於沒一份郵件都有一個共同點,郵件服務器,用戶名,密碼,主題,聯繫人等。對於普通郵件和附件郵件的區別也僅僅在附件方面處理有所不一樣而已。orm
抽象出了嚴重的問題,致使整個工做進展停滯不前,不停的改動,組織最後仍是須要足夠的魄力來個Shift+Delete結束過多的糾結,這樣就有了後面的事了。學習了一下commons-email-1.x的實現思路,從新對發送郵件進行了包裝,這樣解決了不一樣類型郵件的發送問題,收件人電子郵件地址加載問題。
編碼:使用EmailContext類對其進行了相應的處理。
- public class EmailContext {
- private Map<String, String> setMap = null;
- private List<String> contactsList = null;
- private Map<String, String> contentsEmail = null;
- private MultiPartEmail mutEmailObject = null;
- private SimpleEmail simEmailObject = null;
- private File[] attactFiles = null;
- /**
- * 獲取發送郵件實例對象
- *
- * @param setMap
- * @param contactsList
- * @param contentsEmail
- * @param attactFiles
- *
- */
- public EmailContext(Map<String, String> setMap, List<String> contactsList, Map<String, String> contentsEmail, File[] attactFiles) {
- this.attactFiles = attactFiles;
- this.setMap = setMap;
- this.contentsEmail = contentsEmail;
- this.contactsList = contactsList;
- if (this.attactFiles != null) {
- mutEmailObject = new MultiPartEmail();
- }
- if (this.attactFiles == null) {
- simEmailObject = new SimpleEmail();
- }
- }
- /**
- * 發送電子郵件
- *
- * @return String
- */
- public String sendEmail() {
- String result = "發送失敗";
- try {
- if (mutEmailObject != null) {
- setMultiPartEmailMessage();
- result = mutEmailObject.send();
- }
- if (simEmailObject != null) {
- setSimpleEmailMessage();
- result = simEmailObject.send();
- }
- } catch (EmailException ex) {
- Logger.getLogger(EmailContext.class.getName()).log(Level.SEVERE, null, ex);
- JOptionPane.showMessageDialog(null, result, "提示", JOptionPane.INFORMATION_MESSAGE);
- }
- if (!result.equals("發送失敗")) {
- result = "發送成功";
- }
- return result;
- }
- /**
- * 設置帶附件發送郵件信息
- */
- private void setMultiPartEmailMessage() {
- /**
- * 設置發件人信息
- */
- try {
- mutEmailObject.setAuthentication(setMap.get("userName"), setMap.get("userPwd"));
- mutEmailObject.setHostName(setMap.get("hostName"));
- mutEmailObject.setFrom(setMap.get("from"));
- } catch (EmailException ex) {
- Logger.getLogger(EmailContext.class.getName()).log(Level.SEVERE, null, ex);
- JOptionPane.showMessageDialog(null, "提示", "發件人信息加載失敗", JOptionPane.INFORMATION_MESSAGE);
- }
- /**
- * 設置收件人信息
- */
- for (int i = 0, j = contactsList.size(); i < j; i++) {
- try {
- mutEmailObject.addTo(contactsList.get(i));
- } catch (EmailException ex) {
- Logger.getLogger(EmailContext.class.getName()).log(Level.SEVERE, null, ex);
- JOptionPane.showMessageDialog(null, "提示", "聯繫人信息加載失敗", JOptionPane.INFORMATION_MESSAGE);
- }
- }
- /**
- * 設置發送附件信息
- */
- EmailAttachment attact = null;
- for (int i = 0, j = attactFiles.length; i < j; i++) {
- try {
- attact = new EmailAttachment();
- attact.setPath(attactFiles[i].getAbsolutePath());
- mutEmailObject.attach(attact);
- } catch (EmailException ex) {
- Logger.getLogger(EmailContext.class.getName()).log(Level.SEVERE, null, ex);
- JOptionPane.showMessageDialog(null, "提示", "附件加載失敗", JOptionPane.INFORMATION_MESSAGE);
- }
- }
- /**
- * 設置郵件內容信息
- */
- try {
- mutEmailObject.setSubject(contentsEmail.get("theme"));
- mutEmailObject.setMsg(contentsEmail.get("contents"));
- } catch (EmailException ex) {
- Logger.getLogger(EmailContext.class.getName()).log(Level.SEVERE, null, ex);
- }
- }
- /**
- * 設置發送郵件信息
- */
- private void setSimpleEmailMessage() {
- /**
- * 設置發件人信息
- */
- try {
- simEmailObject.setAuthentication(setMap.get("userName"), setMap.get("userPwd"));
- simEmailObject.setHostName(setMap.get("hostName"));
- simEmailObject.setFrom(setMap.get("from"));
- } catch (EmailException ex) {
- Logger.getLogger(EmailContext.class.getName()).log(Level.SEVERE, null, ex);
- JOptionPane.showMessageDialog(
- null, "提示", "發件人信息加載失敗", JOptionPane.INFORMATION_MESSAGE);
- }
- /**
- * 設置收件人信息
- */
- for (int i = 0, j = contactsList.size(); i < j; i++) {
- try {
- simEmailObject.addTo(contactsList.get(i));
- } catch (EmailException ex) {
- Logger.getLogger(EmailContext.class.getName()).log(Level.SEVERE, null, ex);
- JOptionPane.showMessageDialog(
- null, "提示", "聯繫人信息加載失敗", JOptionPane.INFORMATION_MESSAGE);
- }
- }
- /**
- * 設置郵件內容信息
- */
- try {
- simEmailObject.setSubject(contentsEmail.get("theme"));
- simEmailObject.setMsg(contentsEmail.get("contents"));
- } catch (EmailException ex) {
- Logger.getLogger(EmailContext.class.getName()).log(Level.SEVERE, null, ex);
- }
- }
- }
抽象不是一蹴而就的,剛開始就沒能高瞻遠矚的看到這一點,以至後面纔有了一個反反覆覆的迭代的過程,天然也好受教訓了,並且是歷歷在目的。
3.發送方法如此的消瘦
- /**
- * 發送電子郵件
- *
- * @param evt
- */
- private void sendMailActionPerformed(java.awt.event.ActionEvent evt) {
- List<String> contactsList = getContactsList();
- Map<String, String> setMap = getMailSettingInfor();
- Map<String, String> setContentsMap = getMailContents();
- EmailContext ect = new EmailContext(setMap, contactsList, setContentsMap, attactmentsFiles);
- String result = ect.sendEmail();
- statusInforLab.setText(result);
- }
在發送方法中基本上看不到判斷策略的代碼,普通的方法調用,這回算是迴歸本相了。
寫到這,文字上的總結也應該告一段落。關於如何抽象,如何組織,如何設計,如何高瞻遠矚的看到所將要經歷的過程,一大堆的疑問還待經過更多的眼見的,耳聽的,手動的,試驗過的經歷一一解答。