1、問題描述
小明所在的公司請(qǐng)假需要在OA系統(tǒng)上發(fā)布申請(qǐng),整個(gè)請(qǐng)求流程包括多個(gè)處理者,每個(gè)處理者負(fù)責(zé)處理不同范圍的請(qǐng)假天數(shù),如果一個(gè)處理者不能處理請(qǐng)求,就會(huì)將請(qǐng)求傳遞給下一個(gè)處理者,請(qǐng)你實(shí)現(xiàn)責(zé)任鏈模式,可以根據(jù)請(qǐng)求天數(shù)找到對(duì)應(yīng)的處理者。
審批責(zé)任鏈由主管(Supervisor), 經(jīng)理(Manager)和董事(Director)組成,他們分別能夠處理3天、7天和10天的請(qǐng)假天數(shù)。如果超過10天,則進(jìn)行否決。
輸入示例
4
Alice 2
Bob 5
Tom 10
Jerry 12
輸出示例
Alice Approved by Supervisor.
Bob Approved by Manager.
Tom Approved by Director.
Jerry Denied by Director.文章來源:http://www.zghlxwxcb.cn/news/detail-859350.html
2、責(zé)任鏈模式
其實(shí)就是單鏈表數(shù)據(jù)結(jié)構(gòu),一個(gè)個(gè)遞歸向后處理,當(dāng)前節(jié)點(diǎn)能處理就返回文章來源地址http://www.zghlxwxcb.cn/news/detail-859350.html
3、代碼
import com.sun.java.accessibility.util.TopLevelWindowListener;
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
Supervisor s=new Supervisor();
Manager m=new Manager();
Director d=new Director();
s.setNext(m);
m.setNext(d);
int number=Integer.parseInt(sc.nextLine());
for(int i=0;i<number;i++){
String input=sc.nextLine();
String[] ss=input.split(" ");
String username=ss[0];
int day=Integer.parseInt(ss[1]);
s.handleRequest(username,day);
}
}
}
interface Handler{
void setNext(Handler next);
Handler getNext();
void handleRequest(String username,int time);
boolean canHandleRequest(int time);
}
class Supervisor implements Handler{
private Handler next;
@Override
public void setNext(Handler next) {
this.next=next;
}
@Override
public Handler getNext() {
return this.next;
}
@Override
public void handleRequest(String username,int time) {
if(canHandleRequest(time)){
System.out.println(username+" Approved by Supervisor.");
}else {
Handler next=getNext();
next.handleRequest(username,time);
}
}
@Override
public boolean canHandleRequest(int time) {
if(time>3){
return false;
}
return true;
}
}
class Manager implements Handler{
private Handler next;
@Override
public void setNext(Handler next) {
this.next=next;
}
@Override
public Handler getNext() {
return this.next;
}
@Override
public void handleRequest(String username, int time) {
if(canHandleRequest(time)){
System.out.println(username+" Approved by Manager.");
}else {
Handler next=getNext();
next.handleRequest(username,time);
}
}
@Override
public boolean canHandleRequest(int time) {
if(time>5){
return false;
}
return true;
}
}
class Director implements Handler{
private Handler next;
@Override
public void setNext(Handler next) {
this.next=next;
}
@Override
public Handler getNext() {
return this.next;
}
@Override
public void handleRequest(String username, int time) {
if(canHandleRequest(time)){
System.out.println(username+" Approved by Director.");
}else {
System.out.println(username+" Denied by Director.");
}
}
@Override
public boolean canHandleRequest(int time) {
if(time>10){
return false;
}
return true;
}
}
到了這里,關(guān)于設(shè)計(jì)模式代碼實(shí)戰(zhàn)-責(zé)任鏈模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!