现有发房业务的优化(职责链的应用)

一、背景描述

  目前苟且与一家作了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

相关文章
相关标签/搜索