thumbnail

개요

옵저버패턴을 적용하여 개발한 프로젝트입니다.

어떠한 목적을 가지고 제작하였다기보다는, 공부의 개념으로 진행하였습니다.

<br>

팀원 및 역할분담

개인프로젝트

<br>

프로젝트 설명

<img src="https://static.podo-dev.com/blogs/images/2019/09/17/origin/e6fbbbef-1b9b-486d-a357-cfc2012d8070.PNG" style="width:567px;">

JAVA 스윙을 이용한 프로그램입니다.

START 버튼을 클릭시, 일정시간 간격으로 랜덤하게 각 경주마 속도가 지정되고,

목적지에 먼저 도착하는 경주마가 이기는 게임입니다.

<br>

이렇게 만들었습니다

[옵저버 패턴 적용 전]

<img src="https://static.podo-dev.com/blogs/images/2019/09/17/origin/0024eee6-c829-4469-9445-c34e6fc5fbe6.PNG" style="width:567px;">

<br>
위 클래스 구조는 옵저버 패턴을 적용하기 전 설계입니다.

HorseMoverThread는 주기적으로 RacingPanel에 Repaint() 메소드를 호출 함으로써, Horse 클래스의 위치값을 화면에 갱신하여 줍니다.

HorseMoverThread를 주기적으로 호출하여 화면을 갱신하는 것은 문제가 있는 설계입니다.

화면 갱신 주기가 길다면 화면 갱신에 끊김 현상이 있을 것이고, 주기가 짧다면 필요이상으로 많은 화면갱신을 하게 됩니다.

가장 이상적인 접근은 말의 위치값이 변경되었을때 화면을 갱신해주는 것입니다.

<br>
[옵저버 패턴 적용 후]

<img src="https://static.podo-dev.com/blogs/images/2019/09/17/origin/8f6aee6b-3f9e-4c40-9503-9476ce920808.PNG" style="width:567px;">

<br>
위 클래스는 옵저버패턴 적용 후 설계입니다.

옵저버 패턴 적용 설계 부분은 다음과 같습니다.

<img src="https://static.podo-dev.com/blogs/images/2019/09/17/origin/a62be06f-1b1b-499b-95b3-9b1982ab65e6.PNG" style="width:507px;">

말의 위치값을 가지는 Horse 클래스는 Observerble 클래스를 상속 받습니다.

말의 위치를 표시해주는, 즉 화면을 보여주는 RacingPanel 클래스는 Observer 인터페이스를 상속 받습니다.

<br>
RunnigThread 클래스는, 일정시간간격으로 말의 위치를 변경 할 것입니다.

public class RunningThread extends Thread{
	private Horse horse;

	public RunningThread(Horse horse){
		this.horse=horse;
	}
	
	public void run() {
		int location = horse.getMeter();
		int speed;		
		while(GameLogic.getInsatnce().getPlay()){
			location=horse.getMeter();
			speed=horse.getSpeed();
			horse.setMeter(location+speed);
			
			if(location>=800)
				GameLogic.getInsatnce().gameover(horse);
			
			try{
				Thread.sleep(100);
			}catch (Exception e) {
				return;
			}	
		}
		
	}

}

이렇게 말의 위치가 변경되면 notifyObservers() 메소드를 호출합니다.

Observerble 클래스는 참조하고있는 Observer개체들의 update 메소드를 호출할 것입니다.

<br>
<br>

public class Horse extends Observable{
	private RunningThread runningThread;
	//
	
	public void setMeter(int meter) {
		this.meter=meter;
		this.setChanged();
		this.notifyObservers();
	}
	//Code
}

호출되어진 RacingPanel 클래스의 update() 메소드가 호출 됩니다.

Horse 클래스의 위치값을 받아, 말 아이콘을 해당 위치값으로 이동 시킵니다.

<br>
<br>
그 후 repaint() 메소드를 호출하여, RacingPanel 화면을 갱신시킵니다.

public class RacingPanel extends JPanel implements Observer{
	//
	public void update(Observable obj, Object arg) {
		if (obj instanceof Horse) {
			Horse horse = (Horse) obj;
			Point p = horse.getLocation();
			horse.setLocation(horse.getMeter(), p.y);
			repaint();
		}
	}
	//Code
}

<br>
<br>
<br>

개발도구

IDE : Ecplise

Language : Java 1.8

관련링크

소스코드 :https://github.com/cglee079/HorseRacing

CommentCount 0
이전 댓글 보기
등록
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
TOP