現有發房業務的優化(職責鏈的應用)

一、背景描述

  目前苟且與一家作了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();

}
View Code

場景類的實現:

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 );
    }
}
View Code

執行流程的定義:

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;
    }
    
    
}
View Code

操做結果的定義:

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;
    }

}
View Code

  這個demo的實現對於現有的實現,已經在很大程度上進行優化了,讓程序更加靈活,擴展性更強。固然,這個實例還能夠更進一步的優化。

四、優化空間

  一、對節點實現類,更進一步的抽象和封裝,可使程序擴展性更強

  二、對職責節點類進行改進,可讓流程自動調整,程序更加靈活

  三、對不一樣流程節點的實現進行工廠封裝實現

完整示例地址:https://github.com/monkeyming/responsbibility

設計模式的基本介紹你們能夠參考:http://www.cnblogs.com/hpuCode/p/5441157.html

相關文章
相關標籤/搜索