和钉钉请假一个道理,一层一层同意。
实现方式一
package com.example.demo.designMode;
public abstract class Approver {
public Approver approver; //下一个节点
public Approver setApprover(Approver approver){
this.approver = approver;
return this;
}
public abstract Boolean checkOut(Integer day);
}
class GroupApprover extends Approver{
@Override
public Boolean checkOut(Integer day) {
if(day <2){
System.out.println("组长通过请假!");
return true;
}else{
System.out.println("组长通过请假!");
return approver.checkOut(day);
}
}
}
class DepartmentApprover extends Approver{
@Override
public Boolean checkOut(Integer day) {
if(day <5){
System.out.println("部门经理通过请假!");
return true;
}else{
System.out.println("部门经理通过请假!");
return approver.checkOut(day);
}
}
}
class VicePresidentApprover extends Approver{
@Override
public Boolean checkOut(Integer day) {
if(day <10){
System.out.println("副经理通过请假!");
return true;
}else{
System.out.println("请假不通过,天数太长!");
return false;
}
}
}
测试:
package com.example.demo.designMode;
public class Test {
public static void main(String[] args) {
Approver approver = new GroupApprover()
.setApprover(new DepartmentApprover()
.setApprover(new VicePresidentApprover()));
System.out.println(approver.checkOut(9));
}
}
实现方式二
package com.example.demo.designMode;
import java.util.function.Function;
import java.util.function.Predicate;
public abstract class Approver2 {
public Approver2 nextHandler; //下一个节点
public Predicate predicate; //验证进入下个节点的方法
public Approver2 setApprover2(Approver2 nextHandler){
this.nextHandler = nextHandler;
return this;
}
public final Boolean handleMessage(Integer day){
if(predicate.test(day)){
return checkOut(day);
}else{
if (this.nextHandler != null) {
System.out.println("事情太严重,需报告上一级");
return this.nextHandler.handleMessage(day);
} else {
System.out.println("我就是boss,没有上头");
return false;
}
}
}
public abstract Boolean checkOut(Integer day);
}
class GroupApprover2 extends Approver2{
{
predicate = i ->i<2;
}
@Override
public Boolean checkOut(Integer day) {
System.out.println("组长通过请假!");
return true;
}
}
class DepartmentApprover2 extends Approver2{
{
predicate = i ->i<5;
}
@Override
public Boolean checkOut(Integer day) {
System.out.println("组长通过请假!");
return true;
}
}
class VicePresidentApprover2 extends Approver2{
{
predicate = i ->i<10;
}
@Override
public Boolean checkOut(Integer day) {
System.out.println("副经理通过请假!");
return true;
}
}
测试:
package com.example.demo.designMode;
public class Test {
public static void main(String[] args) {
Approver2 approver2 = new GroupApprover2()
.setApprover2(new DepartmentApprover2()
.setApprover2(new VicePresidentApprover2()));
System.out.println(approver2.handleMessage(9));
}
}
实现方式三 Springboot版本
package com.example.designmode.designMode2;
import org.springframework.stereotype.Component;
import java.util.function.Predicate;
@Component
public abstract class SpringBootApprover {
public Predicate predicate; //验证进入下个节点的方法
public abstract Boolean checkOut(Integer day);
}
package com.example.designmode.designMode2;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
@Order(1)
@Service
public class GroupApproverImpl extends SpringBootApprover {
{
predicate = i ->i<2;
}
@Override
public Boolean checkOut(Integer day) {
System.out.println("组长通过请假!");
return true;
}
}
package com.example.designmode.designMode2;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
@Order(2)
@Service
public class DepartmentApproverImpl extends SpringBootApprover {
{
predicate = i ->i<5;
}
@Override
public Boolean checkOut(Integer day) {
System.out.println("组长通过请假!");
return true;
}
}
package com.example.designmode.designMode2;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
@Order(3)
@Service
public class VicePresidentApproverImpl extends SpringBootApprover {
{
predicate = i ->i<10;
}
@Override
public Boolean checkOut(Integer day) {
System.out.println("副经理通过请假!");
return true;
}
}
package com.example.designmode.designMode2;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
@Component
public class XiangHandlerChain {
@Resource
private List approverList;
//计数器,用来找到下一个节点
public Integer index = 0;
public final Boolean handleMessage(Integer day){
if(approverList.get(index).predicate.test(day)){
return approverList.get(index).checkOut(day);
}else{
index ++;
if(index
测试方法
package com.example.designmode;
import com.example.designmode.designMode2.XiangHandlerChain;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
@SpringBootTest
class DesignmodeApplicationTests {
@Resource
XiangHandlerChain xiangHandlerChain;
@Test
void contextLoads() {
xiangHandlerChain.handleMessage(10);
}
}



