设计一个登录验证系统,由用户名验证,密码验证和验证码验证三部分组成。当用户登录时,应该按照顺序执行这些验证器,如果有任意一个验证不通过,则认为登录失败。利用职责链接模式来实现这个应用场景。.用JAVA实现
时间: 2024-02-26 12:56:23 浏览: 21
好的,我理解了你的问题。这里是一个简单的实现,使用职责链模式确保每个验证器按顺序执行并决定是否通过验证。
首先,我们定义一个接口 `LoginValidator` 来表示验证器。它有两个方法:`setNext()` 和 `validate()`。`setNext()` 方法将下一个验证器链接到链中,`validate()` 方法执行实际的验证工作。
```java
public interface LoginValidator {
void setNext(LoginValidator nextValidator);
boolean validate(LoginRequest request);
}
```
然后,我们实现三个具体的验证器:`UsernameValidator`,`PasswordValidator` 和 `CaptchaValidator`。每个验证器实现 `validate()` 方法,如果验证通过,则返回 `true`,否则返回 `false`。如果验证未通过,则不会调用下一个验证器。如果所有的验证器都通过了,那么登录才会成功。
```java
public class UsernameValidator implements LoginValidator {
private LoginValidator nextValidator;
@Override
public void setNext(LoginValidator nextValidator) {
this.nextValidator = nextValidator;
}
@Override
public boolean validate(LoginRequest request) {
String username = request.getUsername();
if (username == null || username.isEmpty()) {
System.out.println("Username is empty");
return false;
}
System.out.println("Username is validated");
return nextValidator.validate(request);
}
}
public class PasswordValidator implements LoginValidator {
private LoginValidator nextValidator;
@Override
public void setNext(LoginValidator nextValidator) {
this.nextValidator = nextValidator;
}
@Override
public boolean validate(LoginRequest request) {
String password = request.getPassword();
if (password == null || password.isEmpty()) {
System.out.println("Password is empty");
return false;
}
System.out.println("Password is validated");
return nextValidator.validate(request);
}
}
public class CaptchaValidator implements LoginValidator {
private LoginValidator nextValidator;
@Override
public void setNext(LoginValidator nextValidator) {
this.nextValidator = nextValidator;
}
@Override
public boolean validate(LoginRequest request) {
String captcha = request.getCaptcha();
if (captcha == null || captcha.isEmpty()) {
System.out.println("Captcha is empty");
return false;
}
System.out.println("Captcha is validated");
return nextValidator.validate(request);
}
}
```
最后,我们创建一个 `LoginRequest` 类来封装登录请求,并使用 `LoginValidator` 链来验证请求。当链中的验证器都通过时,认为登录成功。否则,认为登录失败。
```java
public class LoginRequest {
private String username;
private String password;
private String captcha;
public LoginRequest(String username, String password, String captcha) {
this.username = username;
this.password = password;
this.captcha = captcha;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getCaptcha() {
return captcha;
}
public boolean login(LoginValidator validator) {
return validator.validate(this);
}
}
```
现在我们可以使用这些类来验证登录请求。首先,创建三个验证器实例,并将它们链接在一起:
```java
LoginValidator validator = new UsernameValidator();
validator.setNext(new PasswordValidator());
validator.setNext(new CaptchaValidator());
```
然后,创建一个登录请求对象,并调用 `login()` 方法来验证请求。如果所有的验证器都通过了,那么登录就会成功。
```java
LoginRequest request = new LoginRequest("user", "password", "captcha");
if (request.login(validator)) {
System.out.println("Login succeeded");
} else {
System.out.println("Login failed");
}
```
这里是完整的代码示例:
```java
public interface LoginValidator {
void setNext(LoginValidator nextValidator);
boolean validate(LoginRequest request);
}
public class UsernameValidator implements LoginValidator {
private LoginValidator nextValidator;
@Override
public void setNext(LoginValidator nextValidator) {
this.nextValidator = nextValidator;
}
@Override
public boolean validate(LoginRequest request) {
String username = request.getUsername();
if (username == null || username.isEmpty()) {
System.out.println("Username is empty");
return false;
}
System.out.println("Username is validated");
return nextValidator.validate(request);
}
}
public class PasswordValidator implements LoginValidator {
private LoginValidator nextValidator;
@Override
public void setNext(LoginValidator nextValidator) {
this.nextValidator = nextValidator;
}
@Override
public boolean validate(LoginRequest request) {
String password = request.getPassword();
if (password == null || password.isEmpty()) {
System.out.println("Password is empty");
return false;
}
System.out.println("Password is validated");
return nextValidator.validate(request);
}
}
public class CaptchaValidator implements LoginValidator {
private LoginValidator nextValidator;
@Override
public void setNext(LoginValidator nextValidator) {
this.nextValidator = nextValidator;
}
@Override
public boolean validate(LoginRequest request) {
String captcha = request.getCaptcha();
if (captcha == null || captcha.isEmpty()) {
System.out.println("Captcha is empty");
return false;
}
System.out.println("Captcha is validated");
return nextValidator.validate(request);
}
}
public class LoginRequest {
private String username;
private String password;
private String captcha;
public LoginRequest(String username, String password, String captcha) {
this.username = username;
this.password = password;
this.captcha = captcha;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getCaptcha() {
return captcha;
}
public boolean login(LoginValidator validator) {
return validator.validate(this);
}
}
public class Main {
public static void main(String[] args) {
LoginValidator validator = new UsernameValidator();
validator.setNext(new PasswordValidator());
validator.setNext(new CaptchaValidator());
LoginRequest request = new LoginRequest("user", "password", "captcha");
if (request.login(validator)) {
System.out.println("Login succeeded");
} else {
System.out.println("Login failed");
}
}
}
```