模板方法模式


基本定义: 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤

特点:
它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。

顶层通用接口


每个key都有到期时间,每个key都有前缀,具体时间是多少,key是什么,交给子类去实现。

  1. /**
  2. * 模板方法模式顶层接口 定义通用方法
  3. */
  4. public interface KeyPrefix {
  5. /**
  6. * 设置到期时间
  7. * @return
  8. */
  9. public int expireSeconds();
  10. /**
  11. * 获取key前缀
  12. * @return
  13. */
  14. public String getPrefix();
  15. }

父层封装不变逻辑


父层封装了两个简单的逻辑 , 一:expireSeconds为0代表永不过期 二:给所有key加上前缀,前缀规则为子类的 SimpleName +”:” 再加key

  1. /**
  2. *
  3. * 抽象类BasePrefix实现顶层接口 KeyPrefix, 封装所有key行为的不变逻辑
  4. */
  5. public abstract class BasePrefix implements KeyPrefix{
  6. private int expireSeconds;
  7. private String prefix;
  8. /**
  9. * 0代表永不过期
  10. *
  11. * @param prefix
  12. */
  13. public BasePrefix(String prefix) {
  14. this(0, prefix);
  15. }
  16. public BasePrefix(int expireSeconds, String prefix) {
  17. this.expireSeconds = expireSeconds;
  18. this.prefix = prefix;
  19. }
  20. public int expireSeconds() {//默认0代表永不过期
  21. return expireSeconds;
  22. }
  23. /**
  24. * getClass是指真正的子类,BasePrefix的子类
  25. * @return
  26. */
  27. public String getPrefix() {
  28. String className = getClass().getSimpleName();
  29. return className+":" + prefix;
  30. }
  31. }

子类示例


idKey结果是,永不过期,前缀是UserKey:id
namekey结果是,永不过期,前缀是UserKey:name

  1. /**
  2. *
  3. * 默认以类字段为前缀
  4. *
  5. * 到期时间 详情看父类 BasePrefix
  6. *
  7. */
  8. public class UserKey extends BasePrefix {
  9. public UserKey(String prefix) {
  10. super(prefix);
  11. }
  12. public UserKey(int expireSeconds,String prefix) {
  13. super(expireSeconds,prefix);
  14. }
  15. /**
  16. * 用户key: 以字段名id为前缀
  17. */
  18. public static UserKey idKey = new UserKey("id");
  19. /**
  20. * 用户key: 以字段名mame为前缀
  21. */
  22. public static UserKey nameKey = new UserKey("name");
  23. }