1. 类图
- AbstractClass:抽象类。定义算法骨架和抽象操作
- ConcreteClass:具体实现类。实现抽象类中的抽象操作
2. 示例
父类固定算法框架,子类父子框架内部实现
2.1 对象实体
public class LoginModel {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
LoginModel model = (LoginModel) o;
return Objects.equals(username, model.username) &&
Objects.equals(password, model.password);
}
@Override
public int hashCode() {
return Objects.hash(username, password);
}
}
2.2 抽象类
public abstract class LoginTemplate {
public final boolean login(LoginModel loginModel){
// 1. 获取登录用户数据
LoginModel model = this.findLoginUser(loginModel);
if (model != null) {
// 2. 用户密码加密
String pwd = this.encrypt(model.getPassword());
// 3. 密码替换
loginModel.setPassword(pwd);
// 4. 判断是否匹配
return this.match(loginModel,model);
}
return false;
}
/**
* 用户密码是否正确
*/
protected boolean match(LoginModel loginModel, LoginModel model){
return loginModel.equals(model);
}
/**
* 密码加密
*/
protected String encrypt(String password){
return password;
}
/**
* 根据用户名获取用户信息
*/
protected abstract LoginModel findLoginUser(LoginModel loginModel);
}
2.3 实现类
public class NormalLogin extends LoginTemplate {
@Override
protected LoginModel findLoginUser(LoginModel loginModel) {
LoginModel model = new LoginModel();
model.setUsername("user");
model.setPassword("user");
return model;
}
}
public class AdminLogin extends LoginTemplate {
@Override
protected LoginModel findLoginUser(LoginModel loginModel) {
LoginModel model = new LoginModel();
model.setUsername("admin");
model.setPassword("admin");
return model;
}
@Override
protected String encrypt(String password) {
System.out.println("对管理员用户密码进行加密,此处省略");
return password;
}
}
2.4 客户端
public class Client {
public static void main(String[] args) {
LoginModel model = new LoginModel();
model.setUsername("admin");
model.setPassword("admin");
NormalLogin normalLogin = new NormalLogin();
AdminLogin adminLogin = new AdminLogin();
System.out.println("使用普通用户登录方式,登录结果:" + normalLogin.login(model));
System.out.println("使用管理员用户登录方式,登录结果:" + adminLogin.login(model));
}
}
3. 优点
- 实现了代码复用
4. 缺点
- 父类规定的算法框架不易修改