目前苟且與一家作了7年的公司,仍是什麼都沒有的創業的發展型公司,固然公司對外宣稱是多麼的牛逼,融資多少,可是做爲一個內部員工,看到這些扯淡的話,真是不屑一顧,連脫他褲衩的心情都沒有。在這個公司裏面,我只是一個小的螺絲帽,掀不起波瀾,濺不起水花,擦不出火星,仍是作本身該作的,保持好本身。html
7年了,公司什麼都沒積累下來,可想而知,這個公司是怎麼運行的,是怎麼管理的。各類混亂,各類不堪,各類污(要問我爲何還在這?有些是不方便說的)。說說本身思考的一些業務吧,公司需求對於基礎功能的變更的頻繁性,高的嚇人。就說發佈房源的業務(公司作的是房產方面的)。前端
公司作房產方面的,什麼最重要?原生的真實數據。這個應該不會有人反駁吧!數據來源呢?(1)購買其餘公司的(2)採集其餘公司的(3)業務人員添加的(4)用戶添加的。對於第一個途徑,個人觀點是,不靠譜,哪一個作房產公司的會賣本身的 數據,就算賣確定也是過期的(內鬼不說了);第二個途徑我覺的還行;第三四個途徑最靠譜。要執行第三四個必須讓用戶用着舒服吧,就是儘量下降發佈房源的複雜度,用戶過來,就儘快獲取走用戶的數據,虛假的能夠再刪嘛。git
接下來,就細說一下業務。操做的對象房源分爲住宅、公寓、別墅、商鋪、寫字樓;廣告分爲banner廣告、頁面廣告、以及不一樣城市的網站的廣告;支付方式分爲支付寶、微信、網銀、塊錢;存儲暫時分爲MySQL、MSSQL;發房的最終目標就是把數據 存入本身的數據庫,我列一下公司的業務變動:github
(a)公司最開始是不一樣的房源類型知足不一樣的基本的字段數據,就入庫(前端驗證、後端驗證)數據庫
(b)修改不一樣房源的必須字段(會在不定週期的修改)後端
(c)修改發佈流程,拆成分兩步填寫字段(本意是爲了簡化發房入口),先填一部分基本,而後再填寫一些附加的設計模式
(d)修改發佈流程,發房過程當中能夠選擇是否作廣告(取消信息分佈)微信
(e)修改發佈流程,發房過程當中是否要繳費,去掉廣告業務(不一樣房源,不一樣會員繳費不一樣)dom
(d)修改發佈流程,必需要繳費(分不一樣的繳費狀況)ide
公司的現狀呢,是每一次改動,都是對發房模塊的大改,傷筋動骨,每次都要完整迭代測試,每次引入的bug也很是多。從技術研究和業務結合的角度,我對這個流程從技術層面進行一下優化。
使用職責鏈模式,對流程擴展,取最大流程,設計多種流程,可是每一個節點(職責模塊)進行穩定積累,每次改動只須要測試一下流程,而且不會引入bug,若是有bug也只能是流程方面的bug技術細節上不會有bug。
我本身寫了一個小的示例。UML基本功不紮實,大體畫了一下類圖,有不對的地方,請各位積極指正:
示例的核心代碼
職責節點的抽象實現:
package cn.simple.responsibility.impl; import cn.simple.domain.HouseInfo; import cn.simple.domain.OperationResult; import cn.simple.domain.PublishFlow; import cn.simple.responsibility.IResponsibility; /** * 流程模塊的抽象類 * * @author ldm * @Date 2016年6月21日 */ public abstract class AbstractResponsibility implements IResponsibility { protected AbstractResponsibility responsibility; protected PublishFlow flow; protected HouseInfo house; public AbstractResponsibility(AbstractResponsibility responsibility) { this.responsibility = responsibility; } public PublishFlow getFlow() { return flow; } public void setFlow(PublishFlow flow) { this.flow = flow; } public HouseInfo getHouse() { return house; } public void setHouse(HouseInfo house) { this.house = house; } public abstract OperationResult process(); public abstract boolean isFinish(); }
場景類的實現:
package cn.simple.responsibility; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * Unit test for simple App. */ public class AppTest extends TestCase { /** * Create the test case * * @param testName name of the test case */ public AppTest( String testName ) { super( testName ); } /** * @return the suite of tests being tested */ public static Test suite() { return new TestSuite( AppTest.class ); } /** * Rigourous Test :-) */ public void testApp() { assertTrue( true ); } }
執行流程的定義:
package cn.simple.domain; import cn.simple.flow.IAD; import cn.simple.flow.IPay; import cn.simple.flow.ISave; import cn.simple.flow.IValid; /** * 發佈流程 * * @author ldm * @Date 2016年6月21日 */ public class PublishFlow { private IValid validHouse; private IAD ad; private IPay pay; private ISave save; public IValid getValidHouse() { return validHouse; } public void setValidHouse(IValid validHouse) { this.validHouse = validHouse; } public IAD getAd() { return ad; } public void setAd(IAD ad) { this.ad = ad; } public IPay getPay() { return pay; } public void setPay(IPay pay) { this.pay = pay; } public ISave getSave() { return save; } public void setSave(ISave save) { this.save = save; } }
操做結果的定義:
package cn.simple.domain; /** * 返回操做結果 * * @author ldm * @Date 2016年6月21日 */ public class OperationResult { private String operation; private String field; private String message; private boolean success; public OperationResult() { // TODO Auto-generated constructor stub } public OperationResult(String opr, String field, String msg, boolean success) { this.operation = opr; this.field = field; this.message = msg; this.success = success; } public String getField() { return field; } public void setField(String field) { this.field = field; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String getOperation() { return operation; } public void setOperation(String operation) { this.operation = operation; } public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } }
這個demo的實現對於現有的實現,已經在很大程度上進行優化了,讓程序更加靈活,擴展性更強。固然,這個實例還能夠更進一步的優化。
一、對節點實現類,更進一步的抽象和封裝,可使程序擴展性更強
二、對職責節點類進行改進,可讓流程自動調整,程序更加靈活
三、對不一樣流程節點的實現進行工廠封裝實現
完整示例地址:https://github.com/monkeyming/responsbibility
設計模式的基本介紹你們能夠參考:http://www.cnblogs.com/hpuCode/p/5441157.html