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