设计模式 | 职责链模式(Chain of responsibility)
定义:
结构:(书中图,侵删)
实例:
鸭子类:
- package designpattern.chainofresponsibility;
- public class Duck {
- public State state;
- Duck(State state) {
- this.state = state;
- }
- public enum State {
- DIRTY, CLEAN, COOKED, PACKAGED
- }
- public State getState() {
- return state;
- }
- public void setState(State state) {
- this.state = state;
- }
- }
抽象处理者类:
- package designpattern.chainofresponsibility;
- public abstract class Handler {
- protected Handler successor;
- public void setSuccessor(Handler successor) {
- this.successor = successor;
- }
- public abstract void handleDuck(Duck duck);
- }
清洗者类(具体处理者):
- package designpattern.chainofresponsibility;
- import designpattern.chainofresponsibility.Duck.State;
- public class DuckCleaner extends Handler {
- @Override
- public void handleDuck(Duck duck) {
- if (duck.state == State.DIRTY) {
- System.out.println("清洗员-》清理鸭子~");
- duck.setState(State.CLEAN);
- } else {
- successor.handleDuck(duck);
- }
- }
- }
厨师类(具体处理者):
- package designpattern.chainofresponsibility;
- import designpattern.chainofresponsibility.Duck.State;
- public class DuckCook extends Handler {
- @Override
- public void handleDuck(Duck duck) {
- if (duck.state == State.CLEAN) {
- System.out.println("厨师-》卤制鸭子~");
- duck.setState(State.COOKED);
- } else {
- successor.handleDuck(duck);
- }
- }
- }
打包者类(具体处理者):
- package designpattern.chainofresponsibility;
- import designpattern.chainofresponsibility.Duck.State;
- public class DuckPackager extends Handler {
- @Override
- public void handleDuck(Duck duck) {
- if (duck.state == State.COOKED) {
- System.out.println("打包员-》包装鸭子~");
- duck.setState(State.PACKAGED);
- }
- }
- }
客户端:
- package designpattern.chainofresponsibility;
- import designpattern.chainofresponsibility.Duck.State;
- public class Client {
- public static void main(String[] args) {
- DuckCleaner duckCleaner = new DuckCleaner();
- DuckCook duckCook = new DuckCook();
- DuckPackager duckPackager = new DuckPackager();
- duckCleaner.setSuccessor(duckCook);
- duckCook.setSuccessor(duckPackager);
- // 处理脏鸭子
- Duck duck = new Duck(State.DIRTY);
- duckCleaner.handleDuck(duck);
- // 处理卤好的鸭子
- duck.setState(State.COOKED);
- duckCleaner.handleDuck(duck);
- }
- }
结果输出:
- 清洗员-》清理鸭子~
- 打包员-》包装鸭子~
总结: