设计模式之职责链模式

来源:互联网 发布:js input 宽度 编辑:程序博客网 时间:2024/06/05 05:09

定义

使多个对象都由机会处理请求,从而避免了请求的发送者喝接受者之间的耦合。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

使用場景

當某人申請一定的費用進行活動的時候,根據不同的金額需要通過項目經理,部門經理,總經理的審批。

代碼實例

(1)定義職責的抽象類

package design;public abstract class Handle {//持有下一個處理請求的對象    protected Handle sussor = null;    //這裏使用setter方法,不能使用構造器方法    public void setHandle(Handle h)    {        this.sussor = h;//這裏將h寫成了sussor,報空指針異常    }    public abstract void  handleRequest(String user,int money);}

(2)項目經理的處理

package design;public class ProjectHandle extends Handle {    public void handleRequest(String user,int money)    {        if (money < 500)        {            if (user.equals("小李"))            {                System.out.println("通過申請");            }            else            {                System.out.println("除小李之外都不可以");            }        }        else        {            if (sussor != null)                this.sussor.handleRequest(user,money);            else                System.out.println("sussor為空");        }    }}

(3)部門經理的處理

package design;public class DepHandle extends Handle{    @Override    public void handleRequest(String user, int money) {        // TODO Auto-generated method stub        if (money < 1000)        {            if (user.equals("小李"))            {                System.out.println("部門經理通過了小李的申請");            }            else                System.out.println("部門經理沒批准"+user+"的申請");        }        else{                this.sussor.handleRequest(user, money);        }    }}

(4)縂經理的處理

package design;public class GeneralHandle  extends Handle{    @Override    public void handleRequest(String user, int money) {        // TODO Auto-generated method stub        if (user.equals("小李"))        {            System.out.println("總經理通過了小李的請求");        }        else        {            System.out.println("縂經理沒有通過"+user+"的申請");        }    }}

(5)客戶端

package design;public class Client {    public static void main(String[] args)    {//組裝職責鏈        Handle h1 = new ProjectHandle();        Handle h2 = new DepHandle();        Handle h3 = new GeneralHandle();        h1.setHandle(h2);        h2.setHandle(h3);        h1.handleRequest("小李", 2000);        h1.handleRequest("Burning",100);    }}

運行結果:
總經理通過了小李的請求
除小李之外都不可以

原创粉丝点击