栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA设计模式 - 责任链

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA设计模式 - 责任链

和钉钉请假一个道理,一层一层同意。

实现方式一

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);
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/666358.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号