9、设计模式应用举例:责任链模式:计算阶乘

目录

一、关于责任链模式

二、设计要求

三、设计实现

1.处理者(Handler)

2.具体处理者

四、应用程序

五、执行结果


一、关于责任链模式

职责链模式详解-CSDN博客

二、设计要求

  • 1.设计一个类,该类创建的对象使用int型数据计算阶乘,特点是占用内存少计算速度快。
  • 2.设计一个类,该类创建的对象使用long型数据计算阶乘,尽管没有int数据占用内存少,但能计算更大整数的阶乘。
  • 3.设计一个类,该类创建的对象使用BigInteger对象计算阶乘,特点是占用内存多,但是能计算任意大的整数的阶乘,计算速度相对较慢。

要求使用责任链模式将上面的对象组成一个责任链,要求责任链上的对象的顺序是:首先是使用int型数据计算阶乘的对象,计算不了使用long型,long型计算不了,则使用BigInteger对象计算。

三、设计实现

针对上述问题,使用责任链模式设计若干类,如图:

1.处理者(Handler)
java 复制代码
package xyz.jangle.design.app.chain;
/**
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2026年10月15日 上午8:31:46
 * 
 */
public interface Handler {
	/**
	 * 计算阶乘
	 * 
	 * @author jangle
	 * @time 2026年10月15日 上午8:32:31
	 * @param number
	 */
	void computerMultiply(String number);
	/**
	 * 设置后继处理者
	 * 
	 * @author jangle
	 * @time 2026年10月15日 上午8:32:45
	 * @param handler
	 */
	void setNextHandler(Handler handler);

}
2.具体处理者

UseInt.java

java 复制代码
package xyz.jangle.design.app.chain;
/**
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2026年10月15日 上午8:33:27
 * 
 */
public class UseInt implements Handler {
	
	private Handler handler;
	
	private int result = 1;

	@Override
	public void computerMultiply(String number) {
		int n = Integer.parseInt(number);
		int i = 1;
		while(i<=n) {
			result = result * i;
			if(result <= 0) {
				System.out.println("超出Int型计算能力范围");
				handler.computerMultiply(number);
				return;
			}
			i++;
		}
		System.out.println(number +"的阶乘:"+result);
	}

	@Override
	public void setNextHandler(Handler handler) {
		this.handler = handler;
	}

}

UseLong.java

java 复制代码
package xyz.jangle.design.app.chain;
/**
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2026年10月15日 上午8:38:14
 * 
 */
public class UseLong implements Handler {
	
	private Handler handler;
	private long result = 1;

	@Override
	public void computerMultiply(String number) {
		
		long n = Long.parseLong(number);
		long i = 1;
		while(i <= n ) {
			result = result * i;
			if(result <= 0) {
				System.out.println("超出Long型计算能力范围");
				handler.computerMultiply(number);
				return;
			}
			i++;
		}
		System.out.println(number + "的阶乘是"+ result);
	}

	@Override
	public void setNextHandler(Handler handler) {
		this.handler = handler;
	}

}

UseBigInteger.java

java 复制代码
package xyz.jangle.design.app.chain;

import java.math.BigInteger;

/**
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2026年10月15日 上午8:43:34
 * 
 */
public class UseBigInteger implements Handler {
	
	@SuppressWarnings("unused")
	private Handler handler;
	private BigInteger result = new BigInteger("1");

	@Override
	public void computerMultiply(String number) {
		BigInteger n = new BigInteger(number);
		BigInteger ONE = new BigInteger("1");
		BigInteger i = ONE;
		while(i.compareTo(n) <= 0) {
			result = result.multiply(i);
			i = i.add(ONE);
		}
		System.out.println(number +"的阶乘是"+result);
	}

	@Override
	public void setNextHandler(Handler handler) {
		this.handler = handler;
	}

}

四、应用程序

java 复制代码
package xyz.jangle.design.app.chain;
/**
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2026年10月15日 下午2:13:59
 * 
 */
public class Application {
	
	private Handler useInt,useLong,useBig;
	
	public void createChain() {
		useInt = new UseInt();
		useLong = new UseLong();
		useBig = new UseBigInteger();
		useInt.setNextHandler(useLong);
		useLong.setNextHandler(useBig);
	}
	
	public void reponseClient(String number) {
		useInt.computerMultiply(number);
	}

	public static void main(String[] args) {
		
		Application application = new Application();
		application.createChain();
		application.reponseClient("32");

	}

}

五、执行结果

相关推荐
电子IT笔记5 小时前
人走了,记录不能“空白”: MES×HR 离职人员下拉回显实战
设计模式
博风1 天前
8、设计模式应用举例:适配器模式:Iterator接口与Enumeration接口
设计模式·适配器模式
高晶1 天前
ARM 嵌入式 Linux 系统 U-Boot 开发与移植实战M
设计模式·程序员
geovindu1 天前
rust: Chain of Responsibility Pattern
开发语言·后端·设计模式·rust·责任链模式·行为模式
拆房老料1 天前
【第四部分:Agentic 智能体设计模式】15.为什么 Agent 也需要设计模式
人工智能·设计模式·ai·ai-native
geovindu1 天前
rust: Chain of Responsibility Pattern (续)
开发语言·后端·设计模式·rust·责任链模式·行为模式
Lost of 程序猿1 天前
责任链模式实战:审批流里“层层把关“的艺术
后端·设计模式·asp.net·责任链模式
希洛兔2 天前
状态模式详解:让对象随内部状态自动改变行为
java·设计模式·状态模式
博风2 天前
7、设计模式应用举例:策略模式:加密、解密文件
设计模式·策略模式