05設(shè)計(jì)模式之責(zé)任鏈模式

應(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)聚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容