java监听器模式

最近正在写一个小练习,java贪吃蛇的项目。其中,蛇会移动,蛇每次移动的过程中,都会往自己的监听者发个消息,然后监听者会做出相应的回应。

其中需要先定义一个监听器接口,如下:

package com.skn.listener;

public interface SnakeListener {
	public void snakeMove();
}


其中,定义了snakeMove的接口,表示实现了监听器接口的实现类需要覆盖这个方法,这个方法是针对蛇移动的时候,监听者会调用这个方法。

接下来,蛇是事件源,我们需要在蛇中定义添加监听器的方法,蛇类如下:

package com.skn.entities;

import java.util.ArrayList;
import java.util.List;

import com.skn.listener.SnakeListener;

public class Snake {

<span style="color:#FF0000;">	// 定义蛇的监听器,当蛇有动作的时候,可以被实现了监听器的类监听到,然后做出动作
	private List<SnakeListener> snakeListeners = new ArrayList<SnakeListener>();

	public void addListener(SnakeListener snakeListener) {
		snakeListeners.add(snakeListener);
	}
</span>
	/**
	 * @author shikenian
	 * @param snakeListener
	 *            实现了蛇监听器的子类
	 * @return 删除监听器的结果
	 */
	public boolean removeListener(SnakeListener snakeListener) {
		if (snakeListeners.contains(snakeListener)) {
			snakeListeners.remove(snakeListener);
		}
		return false;
	}

	// 显示自己
	public void drawMe() {
		System.out.println("snake drawme");
	}

	public void changeDirection() {
		System.out.println("snake change direction");
	}

	public void move() {
		System.out.println("snake move");
		Thread moveThread = new Thread(new snakeDriver());
		moveThread.setName("moveThread");
		moveThread.run();
	}

	 class snakeDriver implements Runnable {
		public void run() {
			while (true) {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {

					e.printStackTrace();
				}
				<span style="color:#FF0000;">for (SnakeListener snakeListener : snakeListeners) {
					snakeListener.snakeMove();
				}</span>
			}
		}
	}

}

在飘红的地方分别定义了添加监听器的代码对监听者发送消息的代码。


接下来看我们的监听者代码是如何定义的

package com.skn.controller;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import com.skn.entities.Snake;
import com.skn.listener.SnakeListener;

public class Controller extends KeyAdapter implements SnakeListener {

	private Snake snake;

	public void setSnake(Snake snake) {
		this.snake = snake;
	}

	// 改变蛇的方向
	@Override
	public void keyPressed(KeyEvent e) {
		snake.changeDirection();

	}

	// 改变蛇的方向
	@Override
	public void keyReleased(KeyEvent e) {
		snake.changeDirection();
	}

	<span style="color:#FF0000;">@Override
	public void snakeMove() {
		snake.drawMe();
	}</span>

	// 游戏开始
	public void gameStart() {
		snake.move();
	}
}

上面代码的飘红的部分就是当蛇移动的时候,实现了蛇移动方法的监听器会调用这个snakeMove方法,当调用这个方法的时候,蛇会进行自我刷新,重新显示出新的位置。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值