设计模式之职责链(Chain Of Responsibility)

来源:互联网 发布:python list太大拆分 编辑:程序博客网 时间:2024/06/10 19:11
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象
连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.

适用性:
1.有多个对象可以处理一个请求,那个对象处理该请求运行时刻自动确定.
2.你想在不明确指定接受者的情况下,向多个对象中的一个提交一个请求.
3.可处理一个请求的对象集合应被动态指定.

效果:
1.降低耦合度
2.增强了给对象指派职责的灵活性
3.不保证被接受

代码实现:

击鼓传花实例:在规定时间内,最后一名处理请求


package com.git.books.b_design_patterns.m_chain_of_responsibility;import java.util.Timer;import java.util.TimerTask;/** * @Description: 责任链模式测试类 * @author: songqinghu * @date: 2017年3月9日 上午11:52:33 * Version:1.0 */public class ChainOfResponsibilityClient {    private  Timer timer;    public static void main(String[] args) {        ChainOfResponsibilityClient client = new ChainOfResponsibilityClient();        GamePlayer onePlayer =new OnePeoplePlayer("one people ",null);        GamePlayer twoPlayer = new TwoPeoplePlayer("two people ",null);        GamePlayer threePlayer = new ThreePeoplePlayer("three people ", null);        GamePlayer fourPlayer = new FourPeoplePlayer("four people ", null);        onePlayer.setPlayer(twoPlayer);        twoPlayer.setPlayer(threePlayer);        threePlayer.setPlayer(fourPlayer);        fourPlayer.setPlayer(onePlayer);        client.startGame(1000);        onePlayer.gomeHandle();    }    public void startGame(int second){        timer= new Timer();        System.out.println("the timer task is start!");        timer.schedule(new DrumsTimes(),second);    }    class DrumsTimes extends TimerTask{        @Override        public void run() {            System.out.println("the timer task is end !");            Drums.getInstance().getOrSetNoise("false");            timer.cancel();        }    }}

package com.git.books.b_design_patterns.m_chain_of_responsibility;/** * @Description: 职责链模式  击鼓传花顶级接口类 * @author: songqinghu * @date: 2017年3月9日 下午3:06:16 * Version:1.0 */public interface GamePlayer {    /**     * @描述:游戏处理过程     * @return void     * @createTime:2017年3月9日     * @author: songqinghu     */    public void gomeHandle();    /**     * @描述:传递给下一个用户     * @return void     * @createTime:2017年3月9日     * @author: songqinghu     */     void next();     public void setPlayer(GamePlayer player);}

package com.git.books.b_design_patterns.m_chain_of_responsibility;/** * @Description: 鼓声 * @author: songqinghu * @date: 2017年3月9日 下午3:19:21 * Version:1.0 */public class Drums {     private static class DrumsInner{         private static final Drums drums = new Drums();     }     private Object lock = new Object();     private Drums() {     }     public static Drums getInstance(){         return DrumsInner.drums;     }     private boolean isNoise = true;     public boolean getOrSetNoise(String noise){         if(noise ==null){             return isNoise;         }else{             this.isNoise = Boolean.parseBoolean(noise);             return isNoise;         }     }}

package com.git.books.b_design_patterns.m_chain_of_responsibility;import java.util.Random;import org.apache.commons.lang.math.RandomUtils;public class OnePeoplePlayer implements GamePlayer {    private GamePlayer player;    private String name ;    public OnePeoplePlayer(String name,GamePlayer player) {        this.player = player;        this.name = name;    }    @Override    public void gomeHandle() {        try {            Thread.sleep(RandomUtils.nextInt(5));        } catch (InterruptedException e) {            e.printStackTrace();        }        if(Drums.getInstance().getOrSetNoise(null)){            System.out.println(name + " is pass,the game is continue!");            next();        }else{            //不同的类,这里的处理过程不同            System.out.println(name + " is last people! the gome over!");        }    }    @Override    public void next() {        if(player !=null){            player.gomeHandle();        }else{            throw new RuntimeException(name);        }    }    @Override    public void setPlayer(GamePlayer player) {        this.player = player;    }}

package com.git.books.b_design_patterns.m_chain_of_responsibility;import org.apache.commons.lang.math.RandomUtils;public class TwoPeoplePlayer implements GamePlayer {    private GamePlayer player;    private String name ;    public TwoPeoplePlayer(String name,GamePlayer player) {        this.player = player;        this.name = name;    }    @Override    public void gomeHandle() {        try {            Thread.sleep(RandomUtils.nextInt(5));        } catch (InterruptedException e) {            e.printStackTrace();        }        if(Drums.getInstance().getOrSetNoise(null)){            System.out.println(name + " is pass,the game is continue!");            next();        }else{            //不同的类,这里的处理过程不同            System.out.println(name + " is last people! the gome over!");        }    }    @Override    public void next() {        if(player !=null){            player.gomeHandle();        }else{            throw new RuntimeException(name);        }    }    @Override    public void setPlayer(GamePlayer player) {        this.player = player;    }}

package com.git.books.b_design_patterns.m_chain_of_responsibility;import org.apache.commons.lang.math.RandomUtils;public class ThreePeoplePlayer implements GamePlayer {    private GamePlayer player;    private String name ;    public ThreePeoplePlayer(String name,GamePlayer player) {        this.player = player;        this.name = name;    }    @Override    public void gomeHandle() {        try {            Thread.sleep(RandomUtils.nextInt(5));        } catch (InterruptedException e) {            e.printStackTrace();        }        if(Drums.getInstance().getOrSetNoise(null)){            System.out.println(name + " is pass,the game is continue!");            next();        }else{            //不同的类,这里的处理过程不同            System.out.println(name + " is last people! the gome over!");        }    }    @Override    public void next() {        if(player !=null){            player.gomeHandle();        }else{            throw new RuntimeException(name);        }    }    @Override    public void setPlayer(GamePlayer player) {        this.player = player;    }}

package com.git.books.b_design_patterns.m_chain_of_responsibility;import org.apache.commons.lang.math.RandomUtils;public class FourPeoplePlayer implements GamePlayer {    private GamePlayer player;    private String name ;    public FourPeoplePlayer(String name,GamePlayer player) {        this.player = player;        this.name = name;    }    @Override    public void gomeHandle() {        try {            Thread.sleep(RandomUtils.nextInt(5));        } catch (InterruptedException e) {            e.printStackTrace();        }        if(Drums.getInstance().getOrSetNoise(null)){            System.out.println(name + " is pass,the game is continue!");            next();        }else{            //不同的类,这里的处理过程不同            System.out.println(name + " is last people! the gome over!");        }    }    @Override    public void next() {        if(player !=null){            player.gomeHandle();        }else{            throw new RuntimeException(name);        }    }    @Override    public void setPlayer(GamePlayer player) {        this.player = player;    }}

结构图:



重点:

理解几种形式及能识别出该模式

参考:
<<设计模式>>
<<Java与模式>>

0 0