Java lang

[디자인패턴] 헤드퍼스트 디자인패턴 - 스트래티지 패턴

Razelo 2021. 1. 4. 21:39

 

객체지향의 기초에는 

추상화

캡슐화

다형성

상속

이 존재한다.

 

객체지향의 원칙에는 

바뀌는 부분은 캡슐화한다.

상속보다는 구성을 활용한다.

구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.

가 있다. 

 

객체지향 패턴 중

스트레티지 패턴은

알고리즘군을 정의하고 각각을 캡슐화하여 바꿔 쓸 수 있게 만든다. 스트패티지 패턴을 이용하면 알고리즘을 활용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다. 

 

교재에서 활용한 예제는 다음과 같다. 

public abstract class Duck {
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;
	
	public Duck(){}
	
	public abstract void display();
	public void performFly() {flyBehavior.fly();}
	public void performQuack() {quackBehavior.quack();}
	public void swim() {System.out.println("모든 오리는 물에 뜹니다. 가짜 오리도 뜨죠");}

	public void setFlyBehavior(FlyBehavior fb) {
		this.flyBehavior = fb;
	}

	public void setQuackBehavior(QuackBehavior qb) {
		this.quackBehavior = qb;
	}
	
}
public interface FlyBehavior {
	public void fly();
}
public class FlyNoWay implements FlyBehavior {
	@Override
	public void fly() {
		System.out.println("저는 못날아요");
	}
}
public class FlyRocketPowered implements FlyBehavior {

	@Override
	public void fly() {
		System.out.println("로켓 추진으로 날아갑니다.");
	} 

}
public class FlyWithWings implements FlyBehavior{
	@Override
	public void fly() {
		System.out.println("날고 있어요!!");
	}
}
public class FlyWithWings implements FlyBehavior{
	@Override
	public void fly() {
		System.out.println("날고 있어요!!");
	}
}
public class MiniDuckSimulator {

	public static void main(String[] args) {	
		Duck mallard = new MallardDuck();
		mallard.performFly();
		mallard.performQuack();
		
		Duck model = new ModelDuck();
		model.performFly();
		model.setFlyBehavior(new FlyRocketPowered());
		model.performFly();
	}

}
public class ModelDuck extends Duck {

	
	public ModelDuck() {
		flyBehavior = new FlyNoWay();
		quackBehavior = new Quack();
	}

	@Override
	public void display() {
		System.out.println("저는 모형 오리입니다.");
	}

}
public class MuteQuack implements QuackBehavior {

	@Override
	public void quack() {
		System.out.println("<< 조용 >>");
	}

}
public class Quack implements QuackBehavior {
	@Override
	public void quack() {
		System.out.println("꽥");
	}
}
public interface QuackBehavior {
	public void quack();
}
public class Squack implements QuackBehavior {

	@Override
	public void quack() {
		System.out.println("삑");
	}

}

 

 

헤드 퍼스트 시리즈는 처음 읽어봤다. 여지껏 봐온 책들의 구성과는 달랐다. 본인들도 그렇게 책을 소개했다. 정말 그렇다. 그리고 재밌다. 재밌게 읽을 수 있는 것 같다. 책 내용이 빡빡하지 않아서 쉽게 넘길 수 있다. 그러면서도 객체지향에 대해서 중요한 포인트들을 놓치지 않고 다룬다. 

 

패턴을 머릿속으로 집어넣어야 한다고 했으니... 그러려고 노력중이다. 블로그에 산재되어 있는 글을 읽는 것보다 집약되어 있는 교재 한권으로 공부하니까 확실히 체계적인 학습이 가능하긴 하다. 

 

반응형