設計模式之責任鏈模式

責任鏈模式是一種很是有用的模式。通常分爲純責任鏈模式,非純責任鏈模式。區別只是前者要麼處理,要麼移交給下一個處理。不存在既處理又交給下一個處理。java

責任鏈原型很是簡單,其實就是把能夠處理的類串成一個鏈表,而後依次判斷執行或者交給連接的下一個。session


直接上代碼:
ide

1、純的責任鏈模式:測試

報銷你們都遇到過,若是小於1w的由部門經理審覈,1W和10W之間由總經理審覈,10W及以上由CEO審覈。this

1.抽象經理url

public abstract class AbstractManager {
    private AbstractManager nextPoint;

    public abstract void check(double money);

    public AbstractManager getNextPoint() {
        return nextPoint;
    }

    public void setNextPoint(AbstractManager nextPoint) {
        this.nextPoint = nextPoint;
    }
}

2.CEOspa

public class CEO extends AbstractManager {

    @Override
    public void check(double money) {
        if (money >= 100000) {
            System.out.println("CEO check the money.....");
        } else {
            if (getNextPoint() != null) {
                getNextPoint().check(money);
            }
        }
    }
}

3.部門經理日誌

public class DepartmentManager extends AbstractManager {

    @Override
    public void check(double money) {
        if (money < 10000) {
            System.out.println("DepartmentManager check the money");
        } else {
            if (getNextPoint() != null) {
                getNextPoint().check(money);
            }
        }
    }
}

4.總經理code

public class GeneralManager extends AbstractManager {

    @Override
    public void check(double money) {
        if (money >= 10000 && money < 100000) {
            System.out.println("General manager check the money .....");
        } else {
            if (getNextPoint() != null) {
                getNextPoint().check(money);
            }
        }
    }
}

5.測試
get

public static void main(String[] args) {
    AbstractManager ceo = new CEO();
    AbstractManager departmentManager = new DepartmentManager();
    AbstractManager generalManager = new GeneralManager();
    //建立責任鏈
    departmentManager.setNextPoint(generalManager);
    generalManager.setNextPoint(ceo);

    //直接交給部門經理處理,其餘就不用管啦。
    departmentManager.check(999999);
}

結果就是

5.1 小於1W的

    DepartmentManager check the money

5.2 大於等於1w小於10w的 

    General manager check the money.....

5.4 大於等於10w的

    CEO check the money.....

1、不純的責任鏈模式:

1.抽象過濾器

public abstract class Filter {
    private Filter nextFilter;

    public abstract void handle(Request request);

    public Filter getNextFilter() {
        return nextFilter;
    }

    public void setNextFilter(Filter nextFilter) {
        this.nextFilter = nextFilter;
    }
}

2.日誌過濾器

public class LogFilter extends Filter {
    @Override
    public void handle(Request request) {
        if (request.getUrl() != null && request.getUrl().contains("payBill")) {
            System.out.println("log write payBill");
        }
        if (getNextFilter() != null) {
            getNextFilter().handle(request);
        }

    }
}

3.session過濾器

public class SessionFilter extends Filter {
    @Override
    public void handle(Request request) {

        if (request.getSessionId() == null) {
            System.out.println("session id is none, check the username and password.");
            System.out.println("username and password check successful");
        } else {
            System.out.println("session id check pass");
        }

        if (getNextFilter() != null) {
            getNextFilter().handle(request);
        }
    }
}

4.請求信息

public class Request {
    private String userName;
    private String password;
    private String sessionId;
    private String content;
    private String charSet;
    private String url;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getCharSet() {
        return charSet;
    }

    public void setCharSet(String charSet) {
        this.charSet = charSet;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSessionId() {
        return sessionId;
    }

    public void setSessionId(String sessionId) {
        this.sessionId = sessionId;
    }


    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

5.測試代碼

public static void main(String[] args) throws UnsupportedEncodingException {
    Filter charSetFilter = new CharacterFilter();
    Filter logFilter = new LogFilter();
    Filter sessionFilter = new SessionFilter();
    sessionFilter.setNextFilter(logFilter);
    logFilter.setNextFilter(charSetFilter);



    Request req = new Request();
    req.setContent("今每天氣不錯");
    req.setSessionId("1111");
    req.setCharSet("GBK");
    req.setUserName("lubby");
    req.setPassword("Jack1234565");
    req.setUrl("/payBill");
    sessionFilter.handle(req);
}
相關文章
相關標籤/搜索