职责链模式的实践

某物资管理系统中物资采购需要分级审批,主任可以审批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);
}

 

posted @ 2021-11-01 11:11  好吗,好  阅读(153)  评论(0)    收藏  举报