目录
1 模板模式(Template)
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
何时使用:有一些通用的方法。
如何解决:将这些通用算法抽象出来。
关键代码:在抽象类实现,其他步骤在子类实现。
应用实例: 1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。 2、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。 3、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。
注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。
2 抽象Template类
package com.xudongbase.designpattern.template;
/**
* 模板(Template) 模式抽象Template类
*
* @author xudongmaster
*/
public abstract class CommonTemplate {
/**
* 生成模板
*/
public final void createTemplate() {
System.out.println("开始生成模板");
//通用逻辑
commonLogic();
//特殊逻辑
specialLogic();
System.out.println("结束生成模板\n");
}
/**
* 通用逻辑
*/
protected final void commonLogic() {
System.out.println("这是通用逻辑");
}
/**
* 特殊逻辑
*/
protected abstract void specialLogic();
}
3 具体Template类
3.1 TemplateA类
package com.xudongbase.designpattern.template;
import org.springframework.stereotype.Component;
/**
* 模板(Template) 模式具体Template类A
*
* @author xudongmaster
*/
@Component("TemplateA")
public class TemplateA extends CommonTemplate {
/**
* 特殊逻辑
*/
@Override
public void specialLogic() {
System.out.println("这是模板A的特殊逻辑");
}
}
3.2 TemplateB类
package com.xudongbase.designpattern.template;
import org.springframework.stereotype.Component;
/**
* 模板(Template) 模式具体Template类B
*
* @author xudongmaster
*/
@Component("TemplateB")
public class TemplateB extends CommonTemplate {
/**
* 特殊逻辑
*/
@Override
public void specialLogic() {
System.out.println("这是模板B的特殊逻辑");
}
}
3.3 TemplateC类
package com.xudongbase.designpattern.template;
import org.springframework.stereotype.Component;
/**
* 模板(Template) 模式具体Template类C
*
* @author xudongmaster
*/
@Component("TemplateC")
public class TemplateC extends CommonTemplate {
/**
* 特殊逻辑
*/
@Override
public void specialLogic() {
System.out.println("这是模板C的特殊逻辑");
}
}
3.4 TemplateD类
package com.xudongbase.designpattern.template;
import org.springframework.stereotype.Component;
/**
* 模板(Template) 模式具体Template类D
*
* @author xudongmaster
*/
@Component("TemplateD")
public class TemplateD extends CommonTemplate {
/**
* 特殊逻辑
*/
@Override
public void specialLogic() {
System.out.println("这是模板D的特殊逻辑");
}
}
4 调试代码
package com.xudongbase.designpattern;
import com.xudongbase.designpattern.template.CommonTemplate;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Map;
@SpringBootTest
public class TemplateTest {
@Autowired
private Map<String, CommonTemplate> templateMap;
/**
* 测试模板模式
*/
@Test
public void testTemplate(){
//生成模板A
templateMap.get("TemplateA").createTemplate();
//生成模板B
templateMap.get("TemplateB").createTemplate();
//生成模板C
templateMap.get("TemplateC").createTemplate();
//生成模板D
templateMap.get("TemplateD").createTemplate();
}
}
5 调试结果
注:
(1)具体Template类的调用使用了策略模式。
(2) 需要查看源码请前往Gitee的xudongbase项目design_pattern分支。
xudongbase: 主要是项目中可以用到的共通方法 – Gitee.comhttps://gitee.com/xudong_master/xudongbase/tree/design_pattern/
今天的文章设计模式示例_template服装设计软件分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/86875.html