行为型-模板方法模式

43 阅读3分钟

搜索与xncoding模式相关的代码和实现,以帮助解释该模式的具体内容。

已检索仓库 xncoding 模式 实现 详解 25 个结果

根据搜索结果,xncoding 模式主要是通过模板方法模式(Template Method Pattern)来实现的。这种设计模式属于行为型模式,它定义了一个算法的骨架,并允许子类为一个或多个步骤提供具体实现。

一、核心思想:

  1. 抽象类:定义模板方法和基本操作。
    • 模板方法(templateMethod())定义了算法的框架。
    • 基本操作可以是抽象方法(由子类实现)或具体方法(默认实现)。
  2. 钩子方法:可选的方法,允许子类在特定点修改算法的行为。
  3. 继承机制:子类通过继承抽象类并实现其抽象方法来扩展算法的具体步骤。

二、应用场景

模板方法模式适用于以下情况:

  • 你希望在不同的子类中复用相同的算法结构,但允许它们提供不同的实现。
  • 你需要控制子类扩展的“钩子”点,以避免破坏算法的整体逻辑。

例如,在用户登录验证过程中,模板方法模式可以用来确保所有登录类型都遵循相同的基本流程(查找用户、加密密码、匹配信息),同时允许每个步骤的具体实现因登录类型而异:

登录模板类 LoginTemplate

package com.pattern02.dp15_xncoding.pattern.template.login;

public abstract class LoginTemplate {
    // 模板方法,定义登录流程
    public final boolean login(LoginModel lm) {
        LoginModel dbLm = this.findLoginUser(lm.getLoginId());
        if (dbLm != null) {
            String encryptPwd = this.encryptPwd(lm.getPwd());
            lm.setPwd(encryptPwd);
            return this.match(lm, dbLm);
        }
        return false;
    }

    // 抽象方法:查找用户
    public abstract LoginModel findLoginUser(String loginId);

    // 默认实现:加密密码
    public String encryptPwd(String pwd) {
        return pwd;
    }

    // 默认实现:匹配用户信息
    public boolean match(LoginModel lm, LoginModel dbLm) {
        return lm.getLoginId().equals(dbLm.getLoginId()) && lm.getPwd().equals(dbLm.getPwd());
    }
}

具体登录类 WorkerLogin

package com.pattern02.dp15_xncoding.pattern.template.login;

public class WorkerLogin extends LoginTemplate {
    public LoginModel findLoginUser(String loginId) {
        // 这里省略具体的处理,仅做示意
        LoginModel lm = new LoginModel();
        lm.setLoginId(loginId);
        lm.setPwd("workerpwd" + "md5");
        return lm;
    }

    public String encryptPwd(String pwd) {
        // 覆盖父类的方法,提供真正的加密实现
        System.out.println("使用MD5进行密码加密");
        return pwd + "md5";
    }
}

在这个例子中,login() 方法是一个模板方法,它定义了登录的总体流程。findLoginUser() 是一个抽象方法,需要子类实现;而 encryptPwd()match() 提供了默认实现,可以在子类中覆盖以自定义行为。

三、 示例代码解析

抽象类 AbstractClass

package com.pattern02.dp15_xncoding.pattern.template.standard;

public abstract class AbstractClass {
    // 原语操作1,必须由子类实现
    public abstract void doPrimitiveOperation1();

    // 原语操作2,必须由子类实现
    public abstract void doPrimitiveOperation2();

    // 模板方法,定义算法骨架
    public final void templateMethod() {
        doPrimitiveOperation1();
        doPrimitiveOperation2();
    }
}

具体实现类 ConcreteClass

package com.pattern02.dp15_xncoding.pattern.template.standard;

public class ConcreteClass extends AbstractClass {
    public void doPrimitiveOperation1() {
        // 具体实现
        System.out.println("执行原语操作1");
    }

    public void doPrimitiveOperation2() {
        // 具体实现
        System.out.println("执行原语操作2");
    }
}

在这个例子中,AbstractClass 定义了一个模板方法 templateMethod(),它调用了两个原语操作 doPrimitiveOperation1()doPrimitiveOperation2()。这些方法在 ConcreteClass 中被具体实现。



四、总结

模板方法模式通过将不变的行为抽离到父类中,把可变的部分留给子类去实现,从而实现了代码复用与灵活扩展。这种模式非常适合用于构建框架或库,因为它可以让开发者定义好整体结构,同时允许使用者自由定制某些细节。