目录
一、关于责任链模式
二、设计要求
- 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");
}
}
五、执行结果
