职责链模式
一、定义
为避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生,将请求沿着这条链传递,直到有对象处理它为止。
(职责链模式也称责任链模式,它是一种对象行为型模式。)
二、特点
优点:
- 降低耦合度
- 可简化对象指派职责的灵活性
- 增加新的请求处理类很方便
缺点:
- 不能保证请求一定被接受
- 系统性能将受到一定影响,在进行代码调试时不太方便,可能会造成循环调用
三、使用场景
以下情况可以使用职责链模式:
- 在有多个 对象处理同一个请求,具体哪个对象处理该请求由自动运行时刻自动确定。
- 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可动态指定一组对象处理请求
应用实例:
- 红楼梦中的“击鼓传花”
- 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设计模式—博文专栏持续更新!