职责链模式的实践
某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副总经理可以审批10万元及以下的采购单,总经理可以审批20万元及以下的采购单,20万元以上的采购单需要开职工大会确定。现用职责链模式设计该系统。

DepartmentManager
public class DepartmentManager extends Leader{
public DepartmentManager(String name) {
// TODO Auto-generated constructor stub
super(name);
}
public void handleRequest(ShoppingRequest request)
{
if(request.getMoney()<50000)
{
System.out.println("部门经理" + name + "审批" + request.getShoppingame() + "的采购单 " + request.getMoney() + "元");
}
else
{
if(this.successor!=null)
{
this.successor.handleRequest(request);
}
}
}
}
Director
public class Director extends Leader
{
public Director(String name)
{
super(name);
}
public void handleRequest(ShoppingRequest request)
{
if(request.getMoney()<10000)
{
System.out.println("主任" + name + "审批" + request.getShoppingame() + "的采购单 " + request.getMoney() + "元");
}
else
{
if(this.successor!=null)
{
this.successor.handleRequest(request);
}
}
}
}
GeneralManager
public class GeneralManager extends Leader{
public GeneralManager(String name) {
// TODO Auto-generated constructor stub
super(name);
}
public void handleRequest(ShoppingRequest request)
{
if(request.getMoney()<200000)
{
System.out.println("总经理" + name + "审批" + request.getShoppingame() + "的采购单 " + request.getMoney() + "元");
}
else
{
if(this.successor!=null)
{
this.successor.handleRequest(request);
}
}
}
}
Leader
public abstract class Leader
{
protected String name;
protected Leader successor;
public Leader(String name)
{
this.name=name;
}
public void setSuccessor(Leader successor)
{
this.successor=successor;
}
public abstract void handleRequest(ShoppingRequest request);
}
ShoppingRequest
public class ShoppingRequest
{
private String shoppingame;
private double money;
public String getShoppingame() {
return shoppingame;
}
public void setShoppingame(String shoppingame) {
this.shoppingame = shoppingame;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public ShoppingRequest(String shoppingame, double money) {
super();
this.shoppingame = shoppingame;
this.money = money;
}
}
ViceManager
public class ViceManager extends Leader{
public ViceManager(String name) {
// TODO Auto-generated constructor stub
super(name);
}
public void handleRequest(ShoppingRequest request)
{
if(request.getMoney()<100000)
{
System.out.println("副总经理" + name + "审批" + request.getShoppingame() + "的采购单 " + request.getMoney() + "元");
}
else
{
if(this.successor!=null)
{
this.successor.handleRequest(request);
}
}
}
}
Client
public class Client
{
public static void main(String args[])
{
Leader objDirector,objManager,objGeneralManager,objViceGeneralManager;
objDirector=new Director("王明");
objManager=new DepartmentManager("赵强");
objGeneralManager=new GeneralManager("李波");
objViceGeneralManager=new ViceManager("萧红");
objDirector.setSuccessor(objManager);
objManager.setSuccessor(objViceGeneralManager);
//objGeneralManager.setSuccessor(objGeneralManager);
objViceGeneralManager.setSuccessor(objGeneralManager);
ShoppingRequest lr1=new ShoppingRequest("张三",200000);
objDirector.handleRequest(lr1);
ShoppingRequest lr2=new ShoppingRequest("李四",120000);
objDirector.handleRequest(lr2);
ShoppingRequest lr3=new ShoppingRequest("赵武",20000);
objDirector.handleRequest(lr3);
ShoppingRequest lr4=new ShoppingRequest("王柳",320000);
objDirector.handleRequest(lr4);
}
}

c++代码
// chain-pattern.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
class ShoppingRequest
{
private: string shoppingame;
private:double money;
public:
string getShoppingame() {
return shoppingame;
}
void setShoppingame(string shoppingame) {
this->shoppingame = shoppingame;
}
double getMoney() {
return money;
}
void setMoney(double money) {
this->money = money;
}
ShoppingRequest(string shoppingame, double money) {
this->shoppingame = shoppingame;
this->money = money;
}
};
class Leader
{
protected: string name;
Leader *successor;
public:
Leader(){
}
Leader(string name)
{
this->name = name;
}
void setSuccessor(Leader *successor)
{
this->successor = successor;
}
virtual void handleRequest(ShoppingRequest *request)=0;
};
class Director :public Leader
{
public:
Director(string name)
{
this->Leader::name = name;
//super(name);
}
void handleRequest(ShoppingRequest *request)
{
//cout << "hasa" << endl;
if (request->getMoney()<10000)
{
// cout << "hasa" << endl;
cout << "主任" << name << "审批" << request->getShoppingame() << "的采购单 " << request->getMoney() << "元"<<endl;
}
else
{
if (this->successor != NULL)
{
this->successor->handleRequest(request);
}
}
}
};
class GeneralManager :public Leader
{
public:
GeneralManager(string name)
{
this->Leader::name = name;
//super(name);
}
void handleRequest(ShoppingRequest *request)
{
if (request->getMoney()<200000)
{
cout << "总经理" << name << "审批" << request->getShoppingame() << "的采购单 " << request->getMoney() << "元"<<endl;
}
else
{
if (this->successor != NULL)
{
this->successor->handleRequest(request);
}
}
}
};
class DepartmentManager :public Leader
{
public:
DepartmentManager(string name)
{
this->Leader::name = name;
//super(name);
}
void handleRequest(ShoppingRequest *request)
{
if (request->getMoney()<50000)
{
cout << "部门经理" << name << "审批" << request->getShoppingame() << "的采购单 " << request->getMoney() << "元"<<endl;
}
else
{
if (this->successor != NULL)
{
this->successor->handleRequest(request);
}
}
}
};
class ViceManager :public Leader
{
public:
ViceManager(string name)
{
this->Leader::name = name;
//super(name);
}
void handleRequest(ShoppingRequest *request)
{
if (request->getMoney()<100000)
{
cout << "副总经理" << name << "审批" << request->getShoppingame() << "的采购单 " << request->getMoney() << "元"<<endl;
}
else
{
if (this->successor != NULL)
{
this->successor->handleRequest(request);
}
}
}
};
int main(){ //对象一定指针
Leader *objDirector, *objManager, *objGeneralManager, *objViceGeneralManager;
objDirector = new Director("王明");
objManager = new DepartmentManager("赵强");
objGeneralManager = new GeneralManager("李波");
objViceGeneralManager = new ViceManager("萧红");
objDirector->setSuccessor(objManager);
//cout << 1<<endl;
objManager->setSuccessor(objViceGeneralManager);
//objGeneralManager.setSuccessor(objGeneralManager);
objViceGeneralManager->setSuccessor(objGeneralManager);
ShoppingRequest *lr1 = new ShoppingRequest("张三", 200000);
//cout << 3 << endl;
objDirector->handleRequest(lr1);
//cout << 4 << endl;
ShoppingRequest *lr2 = new ShoppingRequest("李四", 120000);
objDirector->handleRequest(lr2);
ShoppingRequest *lr3 = new ShoppingRequest("赵武", 20000);
objDirector->handleRequest(lr3);
ShoppingRequest *lr4 = new ShoppingRequest("王柳", 320000);
objDirector->handleRequest(lr4);
}


浙公网安备 33010602011771号