行为型模式 | 职责链模式解析及应用

一、定义

为避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生,将请求沿着这条链传递,直到有对象处理它为止。
(职责链模式也称责任链模式,它是一种对象行为型模式。)

二、特点

优点:

  • 降低耦合度
  • 可简化对象指派职责的灵活性
  • 增加新的请求处理类很方便

缺点:

  • 不能保证请求一定被接受
  • 系统性能将受到一定影响,在进行代码调试时不太方便,可能会造成循环调用

三、使用场景

以下情况可以使用职责链模式:

  • 在有多个 对象处理同一个请求,具体哪个对象处理该请求由自动运行时刻自动确定。
  • 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  • 可动态指定一组对象处理请求

应用实例:

  • 红楼梦中的“击鼓传花”
  • JS中的事件冒泡
  • Java Web中Apache Tomcat 对Encoding的处理等

四、类图

在这里插入图片描述

五、实战代码

水果分拣器,将大、中、小三类水果分拣到不同的地方加工。

【AbstractFruitSort.java】

package chain;
import java.util.ArrayList;
import java.util.List;

public abstract class AbstractFruitSort {
	private int weight;
	protected List<String> fruitBox;
	private AbstractFruitSort nextFruitSort;
	
	public void getFruitBox(){
		System.out.print("Weight为:"+weight);
		System.out.println(" 的个数:"+fruitBox.size());
		for(String t:fruitBox){
			System.out.print(t+" ");
		}
		System.out.println(" ");
	}
	public AbstractFruitSort(int weight ){
		this.weight=weight;
		fruitBox=new ArrayList<String>();
	}
	
	public void setNextSort(AbstractFruitSort nextFruitSort){
		this.nextFruitSort =nextFruitSort;
	}
	
	public void sendFruit(int weight,String fruit){
		if(this.weight<=weight)
			pushBox(fruit);
		else 
			if(nextFruitSort!=null)
				nextFruitSort.sendFruit(weight, fruit);
	}
	abstract protected void pushBox(String fruit);
}

【BigFruitSorting .java】

package chain;

public class BigFruitSorting extends AbstractFruitSort {
	public BigFruitSorting(int weight) {
		super(weight);
		// TODO Auto-generated constructor stub
	}

	@Override
	protected void pushBox(String fruit) {
		// TODO Auto-generated method stub
		fruitBox.add(fruit+"->超市货架      ");
	}

}

【MidFruitSorting.java】

package chain;

public class MidFruitSorting extends AbstractFruitSort {
	public MidFruitSorting(int weight) {
		super(weight);
		// TODO Auto-generated constructor stub
	}

	@Override
	protected void pushBox(String fruit) {
		// TODO Auto-generated method stub
		fruitBox.add(fruit+"->水果罐头        ");
	}

}

【SmallFruitSorting.java】

package chain;

public class SmallFruitSorting extends AbstractFruitSort {
	public SmallFruitSorting(int weight) {
		super(weight);
		// TODO Auto-generated constructor stub
	}

	@Override
	protected void pushBox(String fruit) {
		// TODO Auto-generated method stub
		fruitBox.add(fruit+"->炸成果汁         ");

	}
}

【SmallFruitSorting.java】

package chain;

import java.util.Random;

public class Clientclas {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AbstractFruitSort Bfs,Mfs,Sfs;
		Bfs=new BigFruitSorting(9);
		Mfs=new MidFruitSorting(5);
		Sfs=new SmallFruitSorting(2);

		Bfs.setNextSort(Mfs);
		Mfs.setNextSort(Sfs);
		
		Random rm=new Random();
		for(int i=0;i<1000;i++){
			int weight=rm.nextInt(10);
			Bfs.sendFruit(weight, "橙子");
		}
		Bfs.getFruitBox();
		Mfs.getFruitBox();
		Sfs.getFruitBox();
	}
}

【运行截图】

在这里插入图片描述

六、foreach在ArrayList()中的使用

格式:

for(元素类型 元素名称 : 遍历数组(集合)){
      语句
     }

foreach(增强for循环):

public static void main(String[] args) {
           List<String> arr = new ArrayList<String>();
           arr.add("北京");
           arr.add("上海");
           arr.add("南京");
           
           //foreach循环
           for(String str : arr){         //这里的str就是为了获取每次循环的arr中的值
           System.out.println(str);        //就相当于 String str=arr[i]
          }
       }

for循环如下:

public static void main(String[] args) {
        List<String> arr = new ArrayList<String>();
        arr.add("北京");
        arr.add("上海");
        arr.add("南京");
        
        //for循环
        for(int i=0;i<arr.size();i++){
            System.out.println(arr.get(i));    //要获取list中元素需要用get方法    
        }
    }

喜欢的话记得点赞收藏哟😊
Java设计模式—博文专栏持续更新!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雄不是大熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值