STUDY/디자인패턴
chain of responsibility 책임연쇄 패턴
램플릿
2024. 7. 16. 09:17
chain of responsibility
책임연쇄 패턴
Next..Next를 많이 하기 때문에 호불호가 갈리는패턴..
자바스크립트 할때 익숙해지는 문법, 단일링크드리스트를 이해했다면 쉽게 파악가능
패턴들은 네트워크를 다룰때 더욱 빛을 발함.
switch문이나 if문으로 분기해도 되지만, 책임연쇄로 분기하면 클래스로 구현부가 나뉘기때문에 유지보수가 쉽고 가독성이 좋다. 다만 오버헤드가 발생할수 있다는 단점도 존재한다.
서로 참조관계를 잘 몰라도 사용가능하다.
using System.Collections;
using System.Collections.Generic;using UnityEditor;
using UnityEngine;
public interface IHandler
{
void SetNext(IHandler handler);
void HandleRequest(string request);
}
public abstract class Handler : IHandler
{
protected IHandler nextHandler;
public void SetNext(IHandler handler)
{
nextHandler = handler;
}
public abstract void HandleRequest(string request);
}
public class Handler1 : Handler
{
public override void HandleRequest(string request)
{
if (request == "Handler1")
{
// 구현부
Debug.Log("Implement Handler1");
}
else if (nextHandler != null)
{
nextHandler.HandleRequest(request);
}
}
}
public class Handler2 : Handler
{
public override void HandleRequest(string request)
{
if (request == "Handler2")
{
// 구현부
Debug.Log("Implement Handler2");
}
else if (nextHandler != null)
{
nextHandler.HandleRequest(request);
}
}
}
public class Handler3 : Handler
{
public override void HandleRequest(string request)
{
if (request == "Handler3")
{
// 구현부
Debug.Log("Implement Handler3");
}
else if (nextHandler != null)
{
nextHandler.HandleRequest(request);
}
}
}
public class Handler4 : Handler
{
public override void HandleRequest(string request)
{
if (request == "Handler4")
{
// 구현부
Debug.Log("Implement Handler4");
}
else if (nextHandler != null)
{
nextHandler.HandleRequest(request);
}
}
}
public class Handler5 : Handler
{
public override void HandleRequest(string request)
{
if (request == "Handler5")
{
// 구현부
Debug.Log("Implement Handler5");
}
else if (nextHandler != null)
{
nextHandler.HandleRequest(request);
}
}
}
public class COR : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
IHandler handler1 = new Handler1();
IHandler handler2 = new Handler2();
IHandler handler3 = new Handler3();
IHandler handler4 = new Handler4();
IHandler handler5 = new Handler5();
handler1.SetNext(handler2);
handler2.SetNext(handler3);
handler3.SetNext(handler4);
handler4.SetNext(handler5);
/////////////////////////////////////////////////////////
handler1.HandleRequest("Handler2");
handler1.HandleRequest("Handler1");
handler1.HandleRequest("Handler5");
handler1.HandleRequest("Handler3");
handler1.HandleRequest("Handler4");
handler1.HandleRequest("Handler2");
handler1.HandleRequest("Handler4");
}
// Update is called once per frame
void Update()
{
}
}
툴 만들기
툴을 만든다음에 버튼 1번을 누르면 x:10이동
툴을 만든다음에 버튼 2번을 누르면 y:10이동
툴을 만든다음에 버튼 3번을 누르면 z:10이동
툴을 만든다음에 버튼 4번을 누르면 x:1 도 회전
툴을 만든다음에 버튼 5번을 누르면 y:1 도 회전
툴을 만든다음에 버튼 6번을 누르면 z:1 도 회전
슬라이더 값을 이용해서 material color값 변경
언두 리두 반영 되어야함.