23种设计模式介绍含练习demo

之前学习设计模式写了些demo,地址如下,代码中含设计模式的介绍

设计模式Demo地址

实际工作中单例模式、工厂模式、代理模式用的较多。
最近实现数据库多张表同时更新还用了责任链模式,挺有意思的,在此记录一下

·责任链模式顶级接口


package com.tycho.flower.service;

import java.util.List;

import com.alibaba.fastjson.JSONObject;
import com.tycho.flower.entity.DataRecords;
import com.tycho.flower.object.DataRecordsDto;


/**  
 * @ClassName: AbstractWheelDataSaveChain
 * @Description: TODO(责任链接口)
 * @author ll
 * @date 2020-03-25 03:23:27 
*/

public abstract class AbstractWheelDataSaveChain
{
	protected AbstractWheelDataSaveChain nextHandler;
	protected String operation;
	protected boolean onOff;
	public void setNextHandler(AbstractWheelDataSaveChain handler,boolean onOff,String operation){
        this.nextHandler = handler;
        this.onOff = onOff;
        this.operation = operation;
    }

	/**
	 * 保存检测记录
	 * @Title: saveHandler
	 * @Description: TODO(保存检测记录)
	 * @param dataRecDto
	 * @return
	 * @author ll
	 * @date 2020年3月30日
	 */
	public abstract String saveHandler(JSONObject jsonStr);
}

责任链接口实现类,列举一二如下

package com.tycho.flower.service;

import java.util.List;
import java.util.Map;

import org.springframework.data.mongodb.core.aggregation.Aggregation;

import com.alibaba.fastjson.JSONObject;
import com.tycho.flower.entity.Axle;
import com.tycho.flower.entity.EngineBasic;

/**
 * 
 * @ClassName: EngineBasicService
 * @Description: TODO(描述)
 * @author ll
 * @date 2020-03-30 01:58:45
 */
public abstract class EngineBasicService extends AbstractWheelDataSaveChain{
	
}

package com.tycho.flower.service;

import com.alibaba.fastjson.JSONObject;
/**
 * 
 * @ClassName: WheelBasicService
 * @Description: 车轴service
 * @author ll
 * @date 2020-04-09 09:20:17
 */
public abstract class WheelBasicService extends AbstractWheelDataSaveChain
{


}

实现类列举一个吧

package com.tycho.flower.service.impl;

import java.util.Comparator;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOptions;
import org.springframework.data.mongodb.core.query.Collation;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.tycho.flower.dao.EngineBasicDao;
import com.tycho.flower.dao.MemberDao;
import com.tycho.flower.dao.OnlineDetectDao;
import com.tycho.flower.dao.OrganizationDao;
import com.tycho.flower.entity.Axle;
import com.tycho.flower.entity.Carriage;
import com.tycho.flower.entity.DetectedRecord;
import com.tycho.flower.entity.EngineBasic;
import com.tycho.flower.entity.Wheel;
import com.tycho.flower.object.AxleInfoVo;
import com.tycho.flower.object.Member;
import com.tycho.flower.object.Organization;
import com.tycho.flower.object.Organization.OrganizationEngineType;
import com.tycho.flower.service.EngineBasicService;
import com.tycho.flower.utils.DateUtil;
import com.tycho.flower.utils.Null;

/**
 * 
 * @ClassName: EngineBasicServiceImpl
 * @Description: TODO(描述)
 * @author shenjuntao
 * @date 2020-03-30 02:00:21
 */
@Component
public class EngineBasicServiceImpl extends EngineBasicService {

	@Autowired
	private EngineBasicDao engineBasicDao;
	
	@Autowired
	private MemberDao memberDao;
	@Autowired
	private OnlineDetectDao onlineDetectDao;
	@Autowired
	private OrganizationDao orgDao;
	private static final String SS3B ="SS3B";
	private static final String HXD1 ="HXD1";
	
	
	/**
	 * @Title: saveHandler
	 * @Description: TODO(Oh!look,It's a shit mountain)
	 * @param jsonObject
	 * @return String
	 * @see com.tycho.flower.service.AbstractWheelDataSaveChain#saveHandler(java.util.List)
	 * @author abel
	 * @date 2020-03-27 11:36:08
	 */
	@Override
	@Transactional
	public String saveHandler(JSONObject jsonObject) {
		if (!onOff) {
			return null;
		}
		String addenginebasic = "addenginebasic";
		String addaxle = "addaxle";
		String editaxle = "editaxle";
		String repairdown = "repairdown";
		String exchangeaxle = "exchangeaxle";
		//装车里面点击修程上车
		String repairup = "repairup";
		String sparerepairup = "sparerepairup";
		String updateenginetype = "updateenginetype";
		String addrepairrecord = "addrepairrecord";
		String returnJson = null;
		Gson gson = new Gson();
		if(addenginebasic.equals(operation)){
		
		}else if(editaxle.equals(operation)){
			editAxle(jsonObject);
		}else if(repairdown.equals(operation)) {
			repairDown(jsonObject);
		}
		else if(exchangeaxle.equals(operation)) {
		
		}else if(sparerepairup.equals(operation)){
			spareRepairUp(jsonObject);
		}else if(repairup.equals(operation)){
			returnJson = repairUp(jsonObject);
		}else if(updateenginetype.equals(operation)){
		}
		/** 设置下一个要保存数据的动作类 */
		if (null != this.nextHandler) {
			nextHandler.saveHandler(jsonObject);
			return returnJson;
		}

		return returnJson;
	}
}

controller中使用

package com.tycho.flower.web.controller;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.tycho.flower.entity.Axle;
import com.tycho.flower.entity.EngineBasic;
import com.tycho.flower.service.EngineBasicService;
import com.tycho.flower.service.OrganizationService;
import com.tycho.flower.service.TurnOverService;
import com.tycho.flower.service.WheelBasicService;
import com.tycho.flower.utils.FileUtils;
import com.tycho.flower.utils.Null;
import com.tycho.flower.utils.ResponseBo;

/**
 * 
 * @ClassName: EngineBasicController
 * @Description: TODO(描述)
 * @author ll
 * @date 2020-03-30 02:09:37
 */
@RestController
@ComponentScan(basePackages = { "com.tycho.flower.service" })
public class EngineBasicController {
	private static final Logger LOGGER = LoggerFactory.getLogger(EngineBasicController.class);
	@Autowired
	private EngineBasicService engineBasicService;
	@Autowired
	private OrganizationService orgService;

	@Autowired
	private WheelBasicService wheelBasicService;
	@Autowired
	private TurnOverService turnOverService;
	
	@PostMapping(value = "engineBasic/saveAxle")
	public Map<String, Object> saveAxle(HttpServletRequest request, @RequestBody String jsonStr) {
		JSONObject json = JSONObject.parseObject(jsonStr);
		Map<String, Object> result = new HashMap<>();
		try {
			String operation = "addaxle";
			wheelBasicService.setNextHandler(engineBasicService, true, operation);
			engineBasicService.setNextHandler(orgService, true, operation);
			orgService.setNextHandler(turnOverService, true, operation);
			turnOverService.setNextHandler(null, true,operation );
			String returnJson = wheelBasicService.saveHandler(json);
			result.put("data", JSONArray.parseArray(returnJson));
			result.put("flag", true);
			result.put("msg", "添加成功");
			return result;
		} catch (Exception e) {
			LOGGER.error("",e);
			result.put("flag", false);
			result.put("msg", "添加失败");
			return result;
		}
	}

	}

此处engineBasicService; orgService;wheelBasicService; turnOverService都实现了责任链接口AbstractWheelDataSaveChain,当一个engineBasic/saveAxle请求进来就会通过setNextHandler()方法组装一条任务执行链式结构,通过传入参数动态控制责任链的终止,传入要处理的参数

补充:文中一个请求更新数张表的做法本就十分不合理,奈何项目经理执意如此,然后整合了责任链使这个业务变得简单且可扩展点。生活、生活!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对23种设计模式,分别写了demo并画了类图帮助理解。 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。 二、设计模式的六大原则 1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 2、里氏代换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科 3、依赖倒转原则(Dependence Inversion Principle) 这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。 4、接口隔离原则(Interface Segregation Principle) 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。 5、迪米特法则(最少知道原则)(Demeter Principle) 为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。 6、合成复用原则(Composite Reuse Principle) 原则是尽量使用合成/聚合的方式,而不是使用继承。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值