應(yīng)用:責(zé)任鏈模式在SringSecurity的一系列過(guò)濾鏈和多種provider檢驗(yàn)多種登陸方式中用到
類圖

責(zé)任鏈模式.jpg
創(chuàng)建容器的抽象類或者接口
package com.wwj.tank;
public abstract class Collider {
public abstract boolean collide(GameObject o1, GameObject o2);
}
添加具體的一個(gè)實(shí)現(xiàn)類
package com.wwj.tank;
public class BullertTankCollider extends Collider{
@Override
public boolean collide(GameObject o1, GameObject o2) {
if (o1 instanceof Bullert && o2 instanceof Tank){
Bullert bullert = (Bullert)o1;
Tank tank = (Tank)o2;
if(bullert.getGroup() == tank.getGroup()){
return true;
}
if(bullert.getRect().intersects(tank.rect)){
bullert.die();
tank.die();
int bx = tank.getX() + Tank.WIDTH/2 - Expode.WIDTH/2;
int by = tank.getY() + Tank.WIDTH/2 - Expode.WIDTH/2;
GameMode.getInstance().add(new Expode(bx,by));
return false;
}
}else if(o1 instanceof Tank && o2 instanceof Bullert){
collide(o2,o1);
}
return false;
}
}
定義鏈類,同時(shí)繼承或?qū)崿F(xiàn)定義的接口
package com.wwj.tank;
import java.util.LinkedList;
/**
* 碰撞檢測(cè)鏈
*/
public class ColliderChain extends Collider{
private LinkedList<Collider> colliders = new LinkedList<>();
public ColliderChain(){
colliders.add(new BullertTankCollider());
}
@Override
public boolean collide(GameObject o1, GameObject o2) {
for (int i = 0; i < colliders.size(); i++) {
if(!colliders.get(i).collide(o1, o2)){
return false;
}
}
return false;
}
}
調(diào)用責(zé)任鏈
package com.wwj.tank;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
/**
* @author wwj
*/
public class GameMode extends Frame {
private static final GameMode instance = new GameMode();
private ArrayList<GameObject> gameObjects = new ArrayList<>();
ColliderChain colliderChain = new ColliderChain();
public void add(GameObject gameObject){
this.gameObjects.add(gameObject);
}
public void remove(GameObject gameObject){
this.gameObjects.remove(gameObject);
}
private GameMode(){
this.setSize(GAMEWIDTF,GAMEHEIGHT);
this.setResizable(false);
this.setTitle("Tank Game");
this.setVisible(true);
this.addKeyListener(new MyKeyListing());
this.setBackground(Color.BLACK);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static GameMode getInstance(){
return instance;
}
@Override
public void paint(Graphics g){
//畫(huà)出界面提示
g.setColor(Color.WHITE);
//將元素全部畫(huà)出
myTank.paint(g);
for(int index = 0; index < gameObjects.size();index++){
gameObjects.get(index).paint(g);
}
//子彈與坦克的碰撞檢測(cè)
for (int i = 0; i < gameObjects.size(); i++) {
for (int j = i+1; j < gameObjects.size(); j++) {
GameObject o1 = gameObjects.get(i);
GameObject o2 = gameObjects.get(j);
colliderChain.collide(o1,o2);
}
}
}
}
好處:后續(xù)的碰撞都聚集在這條鏈中,新增物體和碰撞方式都只需要新增實(shí)現(xiàn)類即可,高內(nèi)聚