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

1、背景描述

  目前苟且与一家做了7年的公司,还是什么都没有的创业的发展型公司,当然公司对外宣称是多么的牛逼,融资多少,但是作为一个内部员工,看到这些扯淡的话,真是不屑一顾,连脱他裤衩的心情都没有。在这个公司里面,我只是一个小的螺丝帽,掀不起波澜,溅不起水花,擦不出火星,还是做自己该做的,保持好自己。

  7年了,公司什么都没积累下来,可想而知,这个公司是怎么运行的,是怎么管理的。各种混乱,各种不堪,各种污(要问我为什么还在这?有些是不方便说的)。说说自己思考的一些业务吧,公司需求对于基础功能的变动的频繁性,高的吓人。就说发布房源的业务(公司做的是房产方面的)。

  公司做房产方面的,什么最重要?原生的真实数据。这个应该不会有人反驳吧!数据来源呢?(1)购买其他公司的(2)采集其他公司的(3)业务人员添加的(4)用户添加的。对于第一个途径,我的观点是,不靠谱,哪个做房产公司的会卖自己的 数据,就算卖肯定也是过时的(内鬼不说了);第二个途径我觉的还行;第三四个途径最靠谱。要执行第三四个必须让用户用着舒服吧,就是尽可能降低发布房源的复杂度,用户过来,就尽快获取走用户的数据,虚假的可以再删嘛。

2、业务描述

  接下来,就细说一下业务。操作的对象房源分为住宅、公寓、别墅、商铺、写字楼;广告分为banner广告、页面广告、以及不同城市的网站的广告;支付方式分为支付宝、微信、网银、块钱;存储暂时分为MySQL、MSSQL;发房的最终目标就是把数据 存入自己的数据库,我列一下公司的业务变更:

  (a)公司最开始是不同的房源类型满足不同的基本的字段数据,就入库(前端验证、后端验证)

  (b)修改不同房源的必须字段(会在不定周期的修改)

  (c)修改发布流程,拆成分两步填写字段(本意是为了简化发房入口),先填一部分基本,然后再填写一些附加的

  (d)修改发布流程,发房过程中可以选择是否做广告(取消信息分布)

  (e)修改发布流程,发房过程中是否要缴费,去掉广告业务(不同房源,不同会员缴费不同)

  (d)修改发布流程,必须要缴费(分不同的缴费情况)

  公司的现状呢,是每一次改动,都是对发房模块的大改,伤筋动骨,每次都要完整迭代测试,每次引入的bug也非常多。从技术研究和业务结合的角度,我对这个流程从技术层面进行一下优化。

3、优化示例

  使用职责链模式,对流程扩展,取最大流程,设计多种流程,但是每个节点(职责模块)进行稳定积累,每次改动只需要测试一下流程,并且不会引入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的实现对于现有的实现,已经在很大程度上进行优化了,让程序更加灵活,扩展性更强。当然,这个实例还可以更进一步的优化。

4、优化空间

  1、对节点实现类,更进一步的抽象和封装,可以使程序扩展性更强

  2、对职责节点类进行改进,可以让流程自动调整,程序更加灵活

  3、对不同流程节点的实现进行工厂封装实现

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

设计模式的基本介绍大家可以参考:http://www.cnblogs.com/hpuCode/p/5441157.html

转载于:https://www.cnblogs.com/monkeyming/p/5604335.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值