2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
उत्तरदायित्वशृङ्खला प्रतिरूपः : अनुरोधप्रेषकस्य ग्राहकस्य च युग्मनं परिहरन्तु, बहुभ्यः वस्तुभ्यः अनुरोधं प्राप्तुं अवसरं ददतु, एतानि वस्तुनि श्रृङ्खलायां संयोजयन्तु, अनुरोधं च एतस्याः श्रृङ्खलायाः सह यावत् यावत् तत् नियन्त्रयितुं वस्तु न भवति तावत् यावत् पारयन्तुउत्तरदायित्वस्य श्रृङ्खलाप्रतिरूपं कवस्तुव्यवहारप्रतिमानम्。
उत्तरदायित्वप्रतिमानसंरचनायाः श्रृङ्खलायाः मूलं कअमूर्त प्रोसेसर
यथा चित्रात् दृश्यते, उत्तरदायित्वस्य श्रृङ्खलाप्रतिमानसंरचनाचित्रे निम्नलिखितद्वयं भूमिकां भवति ।
(1) Handler (abstract handler): एतत् अनुरोधानाम् संसाधनार्थं एकं अन्तरफलकं परिभाषयति तथा च सामान्यतया अमूर्तवर्गरूपेण परिकल्पितम् अस्ति । यतः भिन्नाः कंक्रीट-सञ्चालकाः अनुरोधं भिन्नरूपेण सम्पादयन्ति, तेषु अमूर्त-अनुरोध-नियन्त्रण-विधयः परिभाषिताः सन्ति ।यतो हि प्रत्येकस्य प्रोसेसरस्य अधीनस्थः अद्यापि प्रोसेसरः अस्ति, अतः अमूर्तप्रोसेसरप्रकारस्य वस्तु (संरचनाचित्रे उत्तराधिकारी) अमूर्तसंसाधके तस्य अधीनस्थः इति परिभाषितः भवतिउद्धरण . अस्य सन्दर्भस्य माध्यमेन हन्डलर्-इत्येतत् श्रृङ्खलायां सम्बद्धं कर्तुं शक्यते ।
(2) ConcreteHandler (concrete handler): एषः abstract handler इत्यस्य उपवर्गः अस्ति तथा च उपयोक्तृ-अनुरोधं सम्भालितुं शक्नोति ।अमूर्तसंसाधके परिभाषिता अमूर्त-अनुरोध-प्रक्रिया-विधिः ठोस-संसाधक-वर्गे कार्यान्विता भवति, तथा च साधयितुं श्रृङ्खलायां अग्रिम-वस्तुं प्राप्तुं शक्नोतिअग्रे प्रेषणस्य अनुरोधःपरिणाम।
उत्तरदायित्वशृङ्खलाप्रतिरूपे प्रत्येकस्य वस्तुनः स्ववंशजानां सन्दर्भाः श्रृङ्खलां निर्मातुं सम्बद्धाः भवन्ति । अनुरोधाः अस्याः श्रृङ्खलायाः उपरि पारिताः भवन्ति यावत् श्रृङ्खलायां कोऽपि वस्तु अन्ततः अनुरोधं सम्पादयति एतेन प्रणाली गतिशीलरूपेण श्रृङ्खलायाः पुनर्गठनं कर्तुं शक्नोति तथा च ग्राहकं न प्रभावितं करोति ।
उत्तरदायित्वस्य श्रृङ्खलाप्रतिमानस्य मूलं अमूर्तसञ्चालकवर्गस्य डिजाइनं भवति ।
abstract class Handler {
//维持对下家的引用
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(String request);
}
उपर्युक्तसङ्केते, अमूर्तप्रोसेसरः अग्रिमप्रोसेसरं प्रति सन्दर्भवस्तुं परिभाषयति यत् अनुरोधं अग्रिमप्रोसेसरं प्रति अग्रे प्रेषयितुं शक्नोति । अस्य वस्तुनः अभिगमकः protected इति सेट् कर्तुं शक्यते, यत् तस्य उपवर्गेषु उपयोक्तुं शक्यते ।
कंक्रीट-सञ्चालकाः अमूर्त-सञ्चालकानां उपवर्गाः सन्ति, तेषां द्वौ प्रमुखौ कार्यौ स्तः ।
विशिष्टस्य हन्डलर् वर्गस्य विशिष्टः कोडः निम्नलिखितरूपेण भवति ।
class ConcreteHandler extends Handler {
public void handleRequest(String request) {
if (请求满足条件) {
//处理请求
}
else {
this.successor.handleRequest(request); //转发请求
}
}
}
एकः निश्चितः क्रय-आदेश-अनुमोदन-व्यवस्था श्रेणीबद्धा भवति अर्थात् क्रय-राशिनुसारं भिन्न-भिन्न-स्तरयोः पर्यवेक्षकैः अनुमोदिता भवति ।
निदेशकः ५०,००० युआन् इत्यस्मात् न्यूनानां क्रय-आदेशानां अनुमोदनं कर्तुं शक्नोति, उपाध्यक्षः [५, १,००,००० युआन्] इत्यस्य क्रय-आदेशस्य अनुमोदनं कर्तुं शक्नोति, बोर्डस्य अध्यक्षः [१०, ५,००,००० युआन्] इत्यस्य क्रय-आदेशस्य अनुमोदनं कर्तुं शक्नोति, ५,००,००० युआन् इत्यस्य क्रय-आदेशस्य अनुमोदनं कर्तुं शक्नोति तथा उपरि चर्चां कर्तुं निर्णयं च कर्तुं बोर्डसभायाः आवश्यकता वर्तते।
यतो हि प्रत्येकस्य पदस्य अनुमोदकानां अधीनस्थाः (संचालकमण्डलं विहाय), तेषां व्यवहारः सामान्यः भवति, तेषु सर्वेषु उत्तराधिकारिभ्यः अनुमोदनानि अग्रे प्रेषणं भवति अतः एकं अनुमोदकवर्गं सारसंसाधकरूपेण डिजाइनं कुर्वन्तु:
//审批者类: 抽象处理者
abstract class Approver {
protected Approver successor; //定义后继对象
protected String name; //审批者姓名
public Approver(String name) {
this.name = name;
}
//设置后继者
public void setSuccessor(Approver successor) {
this.successor = successor;
}
public abstract void processRequest(PurchaseRequest request);
}
ततः प्रत्येकं स्थानं विशिष्टसंसाधकत्वेन अमूर्तसंसाधकं कार्यान्वितं कर्तव्यम् :
//主任: 具体处理者
class Director extends Approver{
public Director(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest request) {
if (request.getAmount() < 50000) {
System.out.println(
MessageFormat.format("主任 {0} 审批采购单:{1}, 金额:{2}元, 采购目的:{3}。",
this.name, request.getNumber(), request.getAmount(), request.getPurpose())
);
} else {
this.successor.processRequest(request); //转发请求
}
}
}
//副董事长:具体处理类
class VicePresident extends Approver{
public VicePresident(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest request) {
if (request.getAmount() < 100000) {
System.out.println(
MessageFormat.format("副董事长 {0} 审批采购单:{1}, 金额:{2}元, 采购目的:{3}。",
this.name, request.getNumber(), request.getAmount(), request.getPurpose())
);
} else {
this.successor.processRequest(request);
}
}
}
//董事长类:具体处理者
class President extends Approver{
public President(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest request) {
if (request.getAmount() < 500000) {
System.out.println(
MessageFormat.format("董事长 {0} 审批采购单:{1}, 金额:{2}元, 采购目的:{3}。",
this.name, request.getNumber(), request.getAmount(), request.getPurpose())
);
} else {
this.successor.processRequest(request);
}
}
}
//董事会类:具体处理者
class Congress extends Approver{
public Congress(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest request) {
System.out.println(
MessageFormat.format("召开董事会 审批采购单:{0}, 金额:{1}元, 采购目的:{2}。",
request.getNumber(), request.getAmount(), request.getPurpose())
);
}
}
अन्यं क्रय-आदेश-वर्गं लक्ष्यरूपेण परिभाषयन्तु यस्य अनुमोदनं करणीयम् अस्ति:
//采购单: 请求类
class PurchaseRequest {
private double amount; //采购金额
private int number; //采购单编号
private String purpose; //采购目的
public PurchaseRequest(double amount, int number, String purpose) {
this.amount = amount;
this.number = number;
this.purpose = purpose;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getPurpose() {
return purpose;
}
public void setPurpose(String purpose) {
this.purpose = purpose;
}
}
क्लायन्ट् परीक्षणसङ्केतः लिखन्तु : १.
class Client {
public static void main(String[] args) {
Approver kangXi, yongZheng, qianLong, hanLinYuan;
kangXi = new Director("康熙");
yongZheng = new VicePresident("雍正");
qianLong = new VicePresident("乾隆");
hanLinYuan = new Congress("翰林院");
//创建职责链
kangXi.setSuccessor(yongZheng);
yongZheng.setSuccessor(qianLong);
qianLong.setSuccessor(hanLinYuan);
//创建采购单
PurchaseRequest pr1 = new PurchaseRequest(45000, 10001, "购买刀");
kangXi.processRequest(pr1);
PurchaseRequest pr2 = new PurchaseRequest(60000, 10002, "购买枪");
kangXi.processRequest(pr2);
PurchaseRequest pr3 = new PurchaseRequest(160000, 10003, "购买火炮");
kangXi.processRequest(pr3);
PurchaseRequest pr4 = new PurchaseRequest(800000, 10004, "购买军舰");
kangXi.processRequest(pr4);
}
}
प्रोग्रामं संकलयित्वा चालयन्तु, आउटपुट् निम्नलिखितम् अस्ति ।
主任 康熙 审批采购单:10,001, 金额:45,000元, 采购目的:购买刀。
副董事长 雍正 审批采购单:10,002, 金额:60,000元, 采购目的:购买枪。
董事长 乾隆 审批采购单:10,003, 金额:160,000元, 采购目的:购买火炮。
召开董事会 审批采购单:10,004, 金额:800,000元, 采购目的:购买军舰。
उपर्युक्तात् किञ्चित् भिन्नं प्रकरणं परिकल्पयामः, यत् उत्तरदायित्वशृङ्खलाप्रतिरूपस्य विषये अस्माकं अवगमनं विस्तारयितुं शक्नोति तथा च येषु परिदृश्येषु तस्य प्रयोगः कर्तुं शक्यते।
विद्यालयः कक्षायाः कृते कानिचन कार्याणि प्रसंस्करणार्थं नियुक्तं करिष्यति एतेषु प्रकारेषु एकं, द्वौ, त्रीणि, चत्वारि इत्यादीनि सन्ति।कक्षाशिक्षकः एक, द्वौ, त्रीणि प्रकाराणि कार्याणि सम्भालितुं शक्नोति, निरीक्षकः च द्वौ प्रकारौ सम्भालितुं शक्नोति एकं, द्वौ कार्याणि, शिक्षणसमितिः एतादृशेषु कार्येषु एकं सम्भालितुं शक्नोति। यदा कक्षायाः शिक्षकः कार्यं प्राप्नोति तदा सः प्रथमं तत् प्रसंस्करणार्थं दलनायकस्य हस्ते समर्पयिष्यति यदि अग्रिमः वर्गः तत् सम्भालितुं न शक्नोति तर्हि कक्षायाः शिक्षकः कार्यं प्राप्स्यति तदा सः प्रथमं तत् सम्पादयिष्यति over to the school committee for processing यदि अग्रिमः वर्गः तत् सम्भालितुं न शक्नोति तर्हि कक्षायाः अध्यापकः यदा विद्यालयसमित्याः कार्यं प्राप्नोति तदा सः स्वयमेव सम्पादयिष्यति। यदा च ते तत् सम्भालितुं न शक्नुवन्ति तदा ते उपरि प्रतिक्रियां दास्यन्ति।
Handler वर्गः अधः अमूर्तसंसाधकरूपेण परिकल्पितः अस्ति:
यतः भवान् भवतः अधीनस्थः च कतिपयान् वर्गकार्यं सम्भालितुं न शक्नुवन्ति इति अनिवार्यतया तथा च ऊर्ध्वगामिनी प्रतिक्रिया अस्ति, तस्मात् प्रोसेसरस्य अनुरोधविधिः बूलियन-रिटर्न्-मूल्यं भवितुम् अर्हति यत् श्रेष्ठं वक्तुं शक्नोति यत् सा कार्यं सम्भालितुं शक्नोति वा इति
abstract class Handler {
protected Handler successor; //定义后继对象
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract boolean handleRequest(String taskName);
}
अधः कक्षाशिक्षकः, दलनेता, अध्ययनसमितेः सदस्यः च क्रमशः विशिष्टसञ्चालकरूपेण परिकल्पिताः सन्ति ।
पूर्वनिर्धारितरूपेण कक्षाशिक्षकः प्रथमं निरीक्षकाय कार्यं दास्यति, निरीक्षकः च पूर्वनिर्धारितरूपेण अध्ययनसमित्याः सदस्याय कार्यं दास्यति, अध्ययनसमित्याः सदस्यः केवलं एकं प्रकारस्य कार्यं सम्भालितुं शक्नोति, यदि च तत् सम्भालितुं न शक्नोति मिथ्या प्रत्यागमिष्यति;
यदि दलनायकेन प्राप्ता प्रतिक्रिया मिथ्या भवति तर्हि सः केवलं एकं वा द्वौ वा प्रकारस्य कार्यौ सम्भालितुं शक्नोति यदि सः तत् सम्भालितुं न शक्नोति।
यदि मुख्याध्यापकेन प्राप्ता प्रतिक्रिया मिथ्या भवति तर्हि सः केवलं एक-द्वितीय-त्रि-प्रकारस्य कार्याणि सम्भालितुं शक्नोति यदि सः कार्याणि सम्भालितुं न शक्नोति तर्हि सः मिथ्या प्रत्यागमिष्यति।
//班主任
class HeadTeacher extends Handler{
@Override
public boolean handleRequest(String taskName) {
boolean handled = successor.handleRequest(taskName);
if (handled) {
return true;
}
if (taskName.equals("one") || taskName.equals("two") || taskName.equals("three")) {
System.out.println("班主任处理了该事务");
return true;
}
return false;
}
}
//班长
class Monitor extends Handler{
@Override
public boolean handleRequest(String taskName) {
boolean handled = successor.handleRequest(taskName);
if (handled) {
return true;
}
if (taskName.equals("one") || taskName.equals("two")) {
System.out.println("班长处理了该事务");
return true;
}
return false;
}
}
//学习委员
class StudyCommissary extends Handler{
@Override
public boolean handleRequest(String taskName) {
boolean handled;
if (successor == null) { //注意学习委员可能没有下家,所以这里判一下是否为空
handled = false;
} else {
handled = successor.handleRequest(taskName);
}
if (handled) {
return true;
}
if (taskName.equals("one")) {
System.out.println("学习委员处理了该事务");
return true;
}
return false;
}
}
क्लायन्ट् परीक्षणसङ्केतः लिखन्तु : १.
प्रत्येकं पदस्य कृते उपगृहाणि स्थापयन्तु, परन्तु अध्ययनसमित्याः सदस्यानां कृते उपसदनं नास्ति इति ध्यानं कुर्वन्तु।
अपि च यदि कश्चन कार्यः अस्ति यत् मुख्याध्यापकः सम्भालितुं न शक्नोति तर्हि तस्य व्याख्यानार्थं लॉगस्य रेखां मुद्रयन्तु ।
public class SchoolClient {
public static void main(String[] args) {
Handler headTeacher, monitor, studyCommissary;
headTeacher = new HeadTeacher();
monitor = new Monitor();
studyCommissary = new StudyCommissary();
headTeacher.setSuccessor(monitor);
monitor.setSuccessor(studyCommissary);
studyCommissary.setSuccessor(null); //没有下一职责人
startRequest(headTeacher, "one");
startRequest(headTeacher, "two");
startRequest(headTeacher, "three");
startRequest(headTeacher, "four");
}
private static void startRequest(Handler headTeacher, String taskName) {
if (! headTeacher.handleRequest(taskName)) {
System.out.println("该班级处理不了此类任务!");
}
}
}
प्रोग्रामं संकलयित्वा चालयन्तु, आउटपुट् निम्नलिखितम् अस्ति ।
学习委员处理了该事务
班长处理了该事务
班主任处理了该事务
该班级处理不了此类任务!
उत्तरदायित्वशृङ्खलाप्रतिरूपं निम्नलिखितपरिस्थितौ विचारयितुं शक्यते।
सन्दर्भपुस्तकानि : १.
"डिजाइन पैटर्न्स की कला" - लियू वी