设计模式之模板模式
- 什么是模板方法模式
在一个抽象类中定义一个操作中的算法骨架,而将一些步骤延迟到子类中去实现。模板模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展,是代码复用方面的基本实现结构。
- 模板方法模式适用情形
(1)、 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
(2)、 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
(3)、 控制子类扩展。模板方法只允许在特定点进行扩展,而模板部分则是稳定的。
- 模板方法模式特点
(1)、 TemplateMethod模式是一种非常基础性的设计模式,在面向对象系统中大量应用。它用最简洁的机制(基础、多态)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
(2)、 在具体实现方面,被TemplateMethod调用的虚方法可以具有实现,也可以没有任何实现(抽象方法或虚方法)。但一般推荐将它们设置为protected方法使得只有子类可以访问它们。
(3)、 模板方法模式通过对子类的扩展增加新的行为,符合“开闭原则”。
(4)、 以后很方便的进行横向子类添加,实现更多业务场景,即便是新人,只需依葫芦画瓢即可完成开发。
- 模板方法模式demo项目结构
- IStoragePost接口
/** * 仓储发货接口。 * @author XXX * @since 2019-01-21 13:41:06 */ public interface IStoragePost { /** * 仓储发货 * @param orders 订单集合 */ void post(List<String> orders); }
- BaseStoragePost基类实现IStoragePost接口
/** * 仓储发货基类。 * 负责确定业务流程和开发通用业务。 * * @author XXX * @since 2019-01-21 13:43:48 */ public class BaseStoragePost implements IStoragePost { //region 变量 //endregion //region IStoragePost /** * 仓储发货 * * @param orders 订单集合 */ @Override public void post(List<String> orders) { /** * 业务流程说明: * 1. * 2. * 3. * 4. */ this.step1(); this.step2(); this.step3(); this.step4(); } //endregion //继续类重写方法 /** * 处理方法1。 */ protected void step1() { } /** * 处理方法2。 */ protected void step2() { } /** * 处理方法3。 */ protected void step3() { } /** * 处理方法4。 */ protected void step4() { } //endregion }
- EDIStoragePost继承BaseStoragePost基类
/** * EDI聚合委外仓储发货。 * * @author XXX * @since 2019-01-21 13:47:35 */ @Service public class EDIStoragePost extends BaseStoragePost { /** * 处理方法1。 */ @Override protected void step1() { //TODO 1 } /** * 处理方法2。 */ @Override protected void step2() { //TODO 2 } /** * 处理方法3。 */ @Override protected void step3() { //TODO 3 } /** * 处理方法4。 */ @Override protected void step4() { //TODO 4 } }
- JackyunWMSStoragePost继承BaseStoragePost基类
/** * 吉客云WMS仓储发货。 * * @author XXX * @since 2019-01-21 13:47:35 */ @Service public class JackyunWMSStoragePost extends BaseStoragePost { /** * 处理方法1。 */ @Override protected void step1() { //TODO 1 } /** * 处理方法2。 */ @Override protected void step2() { //TODO 2 } /** * 处理方法3。 */ @Override protected void step3() { //TODO 3 } /** * 处理方法4。 */ @Override protected void step4() { //TODO 4 } }
- StoragePostFactory工厂类
/** * 仓储发货工厂对象。 * * @author XXX * @since 2019-01-21 13:51:25 */ @Service public class StoragePostFactory { /** * 构造器。 * * @param jackyunWMSStoragePost 吉客云WMS仓储发货 * @param ediStoragePost EDI聚合委外仓储发货 */ @Autowired public StoragePostFactory(JackyunWMSStoragePost jackyunWMSStoragePost, EDIStoragePost ediStoragePost) { StoragePostFactory.jackyunWMSStoragePost = jackyunWMSStoragePost; StoragePostFactory.ediStoragePost = ediStoragePost; } /** * 吉客云WMS仓储发货 */ private static JackyunWMSStoragePost jackyunWMSStoragePost; /** * EDI聚合委外仓储发货 */ private static EDIStoragePost ediStoragePost; /** * 根据仓储发货模式创建发货对象。 * * @param orderPostType 仓储发货模式 * @return */ public static IStoragePost create(StorageOrderPostTypeEnum orderPostType) { switch (orderPostType) { case JACKYUNWMS: return jackyunWMSStoragePost; case EDI: return ediStoragePost; default: throw new RuntimeException("未实现的发货模式“" + orderPostType + "”"); } } }
- StoragePostService
/** * 仓储发货服务。 * * @author XXX * @since 2019-01-21 13:56:19 */ public class StoragePostService { /** * 仓储发货。 * * @param orders 订单集合 */ public void post(List<String> orders) { //对订单进行分组。 Map<StorageOrderPostTypeEnum, List<String>> mapOrder = this.group(orders); //循环所有分组发货。 for (Map.Entry<StorageOrderPostTypeEnum, List<String>> entry : mapOrder.entrySet()) { StoragePostFactory.create(entry.getKey()).post(entry.getValue()); } } /** * 对订单根据业务逻辑进行分组。 * * @param orders * @return */ private Map<StorageOrderPostTypeEnum, List<String>> group(List<String> orders) { //TODO 实现分组 return null; } }
- StorageOrderPostTypeEnum
/** * 仓储发货模式枚举。 * @author XXX * @since 2019-01-21 13:52:30 */ public enum StorageOrderPostTypeEnum { /** * 吉客云WMS */ JACKYUNWMS, /** * EDI聚合委外仓储 */ EDI }