首页 > 其他分享 >if-else结构嵌套多逻辑太复杂?来试试责任链模式 一个例子教会你责任链模式

if-else结构嵌套多逻辑太复杂?来试试责任链模式 一个例子教会你责任链模式

时间:2024-07-06 08:59:12浏览次数:12  
标签:int System 模式 else 责任 nextInt println input out

 复杂的逻辑结构

小伙伴们在刚开始学习if—else结构是不是觉得也不过如此,但是有一天看到了下面一个关于汽车租赁服务的代码你又是什么感受呢

do {
    System.out.println("请选择租车类型:1、轿车2、客车 3、卡车");
    Scanner input = new Scanner(System.in);
    int choose = input.nextInt();
    if (choose > 3 || choose < 0) {
        System.out.println("输入有误请重新输入");
        System.out.println();
        continue;
    }
    switch (choose) {
        case 1:
            System.out.println("请选择品牌:1.红旗2、别克");
            int brandChoose = input.nextInt();
            if (brandChoose == 1) {
                brand = "红旗";
                System.out.println("请选择类型:1.奔腾B50 2.奔腾B70");
                int typeChoose = input.nextInt();
                if (typeChoose > 2 || typeChoose < 0) {
                    System.out.println("输入有误请重新输入");
                    continue;
                }
                type = (typeChoose == 1) ? "奔腾B50" : "奔腾B70";
                System.out.println("请选择颜色:1.白 2.黑");
                int colorChoose = input.nextInt();
                if (colorChoose > 2 || colorChoose < 0) {
                    System.out.println("输入有误请重新输入");
                    continue;
                }
                color = (colorChoose == 1) ? "白" : "黑";
            } else if (brandChoose == 2) {
                brand = "别克";
                System.out.println("请选择类型:1.英朗2.凯越");
                int typeChoose = input.nextInt();
                if (typeChoose > 2 || typeChoose < 0) {
                    System.out.println("输入有误请重新输入");
                    continue;
                }
                type = (typeChoose == 1) ? "英朗" : "凯越";
                System.out.println("请选择颜色:1.白 2.黑");
                int colorChoose = input.nextInt();
                if (colorChoose > 2 || colorChoose < 0) {
                    System.out.println("输入有误请重新输入");
                    continue;
                }
                color = (colorChoose == 1) ? "白" : "黑";
            } else {
                System.out.println("输入有误请重新输入");
                continue;
            }
            break;
        case 2:
            System.out.println("请选择品牌:1.金龙2、金杯");
            brand = (input.nextInt() == 1) ? "金龙" : "金杯";
            System.out.println("请选择座位数:1.16座2、34座");
            int typeChoose = input.nextInt();
            seatCount = (typeChoose == 1) ? 16 : 34;
            System.out.println("请选择颜色:1.白 2.黑");
            int colorChoose = input.nextInt();
            color = (colorChoose == 1) ? "白" : "黑";
            break;
        case 3:
            System.out.println("请选择吨位(输入数字):1.6吨中型卡车 2、14吨重型卡车");
            weight = (input.nextInt() == 1) ? 6 : 14;
    }
    System.out.print("请输入要租赁的天数:");
    int days = input.nextInt();
    MotoOperation motoOpr = new MotoOperation();
    motoOpr.init();
    MotoVehicle moto = motoOpr.rentVehicle(brand, type, seatCount, color, weight);
    System.out.println("******租车结果*******");
    System.out.println("租车成功 !分配给您的车是:" + moto.getVehicleId());
    price += moto.calRent(days);
    System.out.println("请选择是否继续租车:扣1结束");
    i = input.nextInt();
} while (i != 1);

读完上面的代码感觉到恶心了吗,我却认为你读不下去,因为我也看不进去,太长太恶心了没有注释,阅读这种代码简直是在为难自己。那么有什么好办法去让这种逻辑比较复杂的代码更好阅读以及方便我们的后期维护呢?答案就是今天要介绍的责任链模式。

责任链模式

  在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

  看完基础的定义是不是发觉每次请求的传递有点像函数之间的调用,是的这就是类似于递归这种方法,递归和责任链模式都涉及到一种层级或链式的方式来处理问题,即问题(或请求)在某种结构上逐层或逐个传递,直到被处理。如下图所示

        

请求依次经过Handler1,Handler2…… 这样就能简单的实现if-else结构之间的嵌套的一些功能了那么让我们看看具体的实例是如何通过责任链模式来修改我们原来的代码的呢

例题修改 

 首先我们定义一个接口去规范Handler

public interface RentHandler {
    MotoVehicle handleRequest(int choice);
}

接着来看看每个处理具体的Handler类是如何修改的,在责任链模式中,每个处理器都应该有一个方法来处理请求,并且应该有一个机制来决定是否将请求传递给链中的下一个处理器。这通常是通过在处理器中定义一个指向下一个处理器的引用(通常是一个字段)和一个处理请求的方法来实现的。

public class CarHandler implements RentHandler {
    private RentHandler nextHandler;


    public CarHandler(RentHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public MotoVehicle handleRequest(int choice) {
        if (choice == 1) {
            return rentCar();
        } else if (nextHandler != null) {
            return nextHandler.handleRequest(choice);
        }
        return null;
    }

    private MotoVehicle rentCar() {
        Scanner input = new Scanner(System.in);
        System.out.println("请选择品牌: 1、红旗 2、别克");
        int brandChoose = input.nextInt();
        String brand = (brandChoose == 1) ? "红旗" : "别克";

        String type;
        if (brand.equals("红旗")) {
            System.out.println("请选择类型: 1.奔腾B50 2.奔腾B70");
            int typeChoose = input.nextInt();
            type = (typeChoose == 1) ? "奔腾B50" : "奔腾B70";
        } else {
            System.out.println("请选择类型: 1.英朗 2.凯越");
            int typeChoose = input.nextInt();
            type = (typeChoose == 1) ? "英朗" : "凯越";
        }

        System.out.println("请选择颜色: 1.白 2.黑");
        int colorChoose = input.nextInt();
        String color = (colorChoose == 1) ? "白" : "黑";
        return new Car(brand, type,  color);
    }

}

类似的我们把刚才的案例代码中的所有汽车类型都分别加入类中,最后我们通过这样的代码来传递请求

RentHandler handlerChain = new CarHandler(new BusHandler( new TruckHandler(null)));

看完是不是彻底懵逼了,根本看不懂下面就让我来带着你看看是如何具体实现的

修改分析 

1、责任链的构建 

CarHandler开始,然后是BusHandler,最后是TruckHandler。这意味着当请求首先到达CarHandler时,它将有机会处理该请求;如果它决定不处理,则请求将传递给BusHandler;依此类推,直到请求被处理或到达链的末尾。

2、处理器的实现

在责任链模式中,每个处理器都应该有一个方法来处理请求,并且应该有一个机制来决定是否将请求传递给链中的下一个处理器。这通常是通过在处理器中定义一个指向下一个处理器的引用(通常是一个字段)和一个处理请求的方法来实现的。例如,每个处理器类可能都会有一个setNextHandler(Handler next)方法来设置下一个处理器,以及一个handleRequest(Request request)方法来处理请求或将其传递给下一个处理器。 

3、请求的传递 

handleRequest方法中,每个处理器都会检查它是否应该处理当前请求。如果应该处理,则它会执行相应的操作;如果不应该处理,则它会将请求传递给链中的下一个处理器。这通常是通过调用nextHandler.handleRequest(request)(如果nextHandler不为null)来实现的。 

4、链的结束 

TruckHandler是链中的最后一个处理器,并且它被初始化为null。这是责任链的常见做法,以表示链的末尾。然而,在实际实现中,您可能需要确保在TruckHandler(或链中任何其他可能作为最后一个处理器的类)的handleRequest方法中处理nullnextHandler情况,以避免NullPointerException。 

看完上面的解析是不是有点感觉了,原来这就是责任链模式,很快你也就发现了特点,这不就是把刚才的switch—case结构改成了这样的一个一个条件传递判断吗?是的也正是这样这个例子中我们也只是展示一点用处。在下一篇文章我将详细讲清楚优缺点。

标签:int,System,模式,else,责任,nextInt,println,input,out
From: https://blog.csdn.net/qishuang6/article/details/140213365

相关文章

  • 责任链模式的优缺点——基于Java实际开发的应用
     相信读了上一篇文章你对责任链模式有了初步的了解,没读也没关系,上一篇文章是关于责任链模式的一个使用例子,阅读顺序无所谓,可以先看完这篇文章再回头去把我上一篇文章看看,相信两篇文章看下来你能对责任链模式有更加深入的理解。接下来我就详细的说说看责任链模式的优缺点以及......
  • 在Linux中,使用rsync服务模式时,如果指定了⼀个密码文件,那么这个密码文件的权限应该设置
    在使用rsync的服务模式时,如果使用了密码认证机制,密码文件是一个非常重要的安全组件。密码文件通常包含用户名称和加密后的密码,用于验证客户端的访问权限。为了确保密码文件的安全性,应该将其权限设置为尽可能严格。理想情况下,密码文件的权限应该设置为仅允许rsync服务进程访问......
  • 设计模式学习(二)工厂模式——抽象工厂模式
    目录背景抽象工厂模式优点与缺点背景现在我需要开发一个相机操作模块,它可能在Windows下运行,也可能在Linux下运行。由于在厂家提供的SDK中,Windows下的SDK和Linux下的SDK是有区别的,因此我们要创建两个类去封装这两个不同平台下的API。我们先使用工厂方法模式去设计(以Basler相机为......
  • 【设计模式(七)】结构型模式--适配器模式
    定义:​ 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。把适配者类通过适配器转化为目标接口。例如下图的将三角接口转换成我们希望的二角接口适配器模式(Adapter)包含以下主要角色:目标(Target)接口:当前系统业务所期待的......
  • 【设计模式(六)】结构性模式--代理模式
    结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。......
  • 【设计模式(五)】创建型模式--建造者模式
    创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。概述:建造者模式注重的是部件构建的过程,意在通过一步一步地精确构造创建出一个复杂的对象。建造者(Builder)模式包含如下角色:......
  • 【设计模式(四)】创建型模式--原型模式
    创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。概述:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。原型模式包含如下角色:抽象原型类:......
  • 【设计模式(二)】创建型模式--抽象工厂模式
    创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。抽象工厂模式也是⼀种创建型设计模式,提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类抽象工厂模式与工......
  • “谋士三国”诸葛亮的锦囊妙计 - 策略模式
    “当代码如三国,智慧如孔明,何愁天下设计不归一统?”乱世之中,英雄辈出。三国的战场上,不仅刀光剑影,更有智慧的较量。诸葛亮的锦囊妙计,不正是今日软件设计中策略模式的完美写照吗?让我们穿越时空,从一场惊心动魄的草船借箭开始,揭开策略模式的神秘面纱。赤壁江边战鼓鸣,孔明妙计......
  • rabbitmq 集群模式简介
    为什么搭建rabbitmq集群?rabbitmq集群有那些模式?如何搭建Rabbitmq集群?rabbitmq镜像高可用策略有那些?1、首先这款产品本身的优点众多,大家最看好的便是他的异步化提高系统抗峰值能力,然后便是系统及功能结构解耦,那么照此两点来说,他的在整个系统中的作用还是至关重要的,那么如此重......