Develop/Java

[7주차] 디자인패턴 기초실습

SpruceMoon 2025. 10. 15. 19:33

1. 디자인 패턴 기초

디자인 패턴 : 가장 효율적이고 검증된 설계 방법으로, SOLID 원칙을 코드에 실제로 녹여내는 가장 실용적인 방법 중 하나.

-  대표적인 디자인 패턴

 1) 전략 패턴 :: 알고리즘을 쉽게 바꾸는 것이 목표인 패턴. OCP의 정석!

   - 알고리즘(전략)을 통째로 갈아 끼울 수 있게 만드는 패턴.

   - 이전 실습인 커피메이커에서 if/else문으로 조건문을 만들어 결제수단을 만들면, 결제수단이 새로 추가된다면 if문이 늘어나고 수정도 불편해진다! 즉 OCP 원칙을 적용해 코드를 수정하기 위해 전략 패턴을 사용할 수 있음. (결제수단의 전략을 클래스로 구현하기)

 

 2) 팩토리 메소드 패턴 :: 직접 'new'하지 않고 객체 생성 방법을 공장에 대신 깔끔히 맡기는(위임하는) 패턴

   - 생성 로직을 캡슐화하고 싶을 때 사용.

   - 이전 실습인 커피메이커에서 커피를 주문할 때 제조는 Factory에서 하도록 만드는 것이 그 예시다! CoffeeFactory.java도 수정하고 싶지 않다면 레지스트리를 쓰라고 한다..

 

 3) 데코레이터 패턴 :: 기존 객체에 기능을 겹겹이 덧붙여 꾸미는 패턴.

   - 추가기능을 기존 기능의 조합으로 확장하고 싶지만 기존 클래스는 건드리고 싶지 않을 때 사용하는 패턴.

   - 이전 실습인 커피메이커에서, 아이스초코라떼라는 기능이 새로 추가되어서 이를 만들 때 기능을 계층적으로 조합해서 음료를 제조할 수 있다.

이르케

 

 4) 싱글톤 패턴 :: 클래스의 인스턴스가 오직 하나만 존재하도록 보장하는 패턴, 유일무이한 객체를 만듦.

 +) 템플릿 메소드 패턴

 

2. 짱구 전략패턴 실습

 - 각 상황에 따라 알맞은 전략을 취하는 짱구

 - 행동 전략 인터페이스

public interface IBehaviorStrategy {
	public void behave(String context);
}

 

 - 세 가지 하위 행동 전략이 있음. (비매너전략 / 매너전략 / 회피전략)

package c20251015;

public class DanceStrategy implements IBehaviorStrategy{

	@Override
	public void behave(String context) {
		// TODO Auto-generated method stub
		System.out.println(context + " 상황..");
		System.out.println("비매너모드!");
	}

}
package c20251015;

public class ActionMaskStrategy implements IBehaviorStrategy {

	@Override
	public void behave(String context) {
		// TODO Auto-generated method stub
		System.out.println(context + " 상황..");
		System.out.println("용감해져요!");
	}
	
}
package c20251015;

public class SleepStrategy implements IBehaviorStrategy{

	@Override
	public void behave(String context) {
		// TODO Auto-generated method stub
		System.out.println(context + " 상황..");
		System.out.println("눈을 감고 상황을 회피!");
	}
}

 

 - (전략대로 행동을 취할) 짱구 클래스.

package c20251015;

public class 짱구{
	//private final IBehaviorStrategy strategy = null;  써도 됨 . 안됨 수정필요할ㄷ듯
	private IBehaviorStrategy strategy;
	
	public void setStrategy(IBehaviorStrategy strategy) {
		this.strategy = strategy;
		System.out.println("현재 짱구의 매너 전략 : " + this.strategy.getClass().getSimpleName() + "장착!");
		
		
	}
	public void encountSituation(String situation) {
		System.out.println("[상황발생]! ::"+ situation);
		if(this.strategy == null) {
			System.out.println("전략 그런 거 없고 놀게용");
			return;
		}
		strategy.behave(situation);
	}
	
	
}

 

 - 실행할 메인 파일. 각각의 상황이 주어지고 적용할 전략을 불러줌!

package c20251015;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		짱구 a = new 짱구();
		
		//전략없음
		a.encountSituation("내일 시험봄");
		
		a.setStrategy(new DanceStrategy());
		a.encountSituation("친구들과 놀기");	
		
		a.setStrategy(new SleepStrategy());
		a.encountSituation("엄마가 귀찮은 심부름을 시킴");
		
		a.setStrategy(new ActionMaskStrategy());
		a.encountSituation("훈이가 괴롭힘당함");
	}
	
}​

실행결과