디자인패턴

1. 옵저버 패턴 정의

- 옵저버 패턴(Observer Pattern)에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고

  자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의합니다.



'디자인패턴' 카테고리의 다른 글

스트래티지 패턴(strategy pattern)  (0) 2019.02.03
디자인 패턴 소개.  (0) 2019.02.03

1. 스크래티지 패턴(Strategy Pattern)

- 스트래티지 패턴(Strategy Pattern)에서는 알고리즘군을 정의하고 각각을 "캡슐화"하여 교환해서 사용할 수 있도록 만든다.

  스트래티지를 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.



2. p63. 연습문제

2-1. 클래스를 정돈합니다.

2-2. 추상클래스 1개, 인터페이스 1개, 클래스 8개를 구분합니다.

2-3. 클래스들을 화살표로 연결합니다.

a. 상속(확장)에 대해서는              ㅡㅡㅡㅡㅡ▷

b. 인터페이스에 대해서는             -----------▷

c. A에는 B가 있다 관계에 대해서는 ㅡㅡㅡㅡ>

2-4. 적당한 클래스를 찾아서 setWeapon() 메소드를 찾아 넣으세요




★ Chracter 추상클래스


public abstract class Character {
	WeaponBehavior weapon;
	public abstract void fight();
	
	public void setWeapon(WeaponBehavior weapon) {
		this.weapon = weapon;
	}
}


★ WeaponBehavior 인터페이스


public interface WeaponBehavior {
	public void useWeapon();
}


★ WeaponBehavior 인터페이스를 구현하는 클래스


public class AxeBehavior implements WeaponBehavior{
	public void useWeapon() {
		System.out.println("도끼를 씁니다.");
	}
}
public class BowAndArrowBehavior implements WeaponBehavior{
	public void useWeapon() {
		System.out.println("활과 화살을 씁니다.");
	}
}
public class KnifeBehavior implements WeaponBehavior{
	public void useWeapon() {
		System.out.println("칼을 씁니다.");
	}
}
public class SwordBehavior implements WeaponBehavior{
	public void useWeapon() {
		System.out.println("검을 씁니다.");
	}
}


★ Chracter 추상클래스를 상속받는 클래스


public class King extends Character{
	public King() {
		weapon = new AxeBehavior();
	}
	public void fight() {
		weapon.useWeapon();
	}
}
public class Knight extends Character{
	public Knight() {
		weapon = new BowAndArrowBehavior();
	}
	public void fight() {
		weapon.useWeapon();
	}
}
public class Queen extends Character{
	public Queen() {
		weapon = new KnifeBehavior();
	}
	public void fight() {
		weapon.useWeapon();
	}
}
public class Troll extends Character{
	public Troll() {
		weapon = new SwordBehavior();
	}
	public void fight() {
		weapon.useWeapon();
	}
}


★ Main 메소드


public static void main(String[] args) {
		// TODO Auto-generated method stub
		Character king = new King();
		Character knight = new Knight();
		Character queen = new Queen();
		Character troll = new Troll();
		king.fight();
		knight.fight();
		queen.fight();
		troll.fight();
		
		// king 무기 변경
		king.setWeapon(new KnifeBehavior());
		king.fight();
	}

- 실행결과 :

도끼를 씁니다.            // king.fight()

활과 화살을 씁니다.     // knight.fight()

칼을 씁니다.              // queen.fight()

검을 씁니다.              // troll.fight()

칼을 씁니다.              // king.fight()


★ 결론

- 각 캐릭터 클래스 별로 fight를 하는 특징이 모두 다르다. 

  이 때 단순히 상속을 통한 오버라이드를 통해서도 구현이 가능하다.

  하지만, fight를 하지 않는 캐릭터가 추가된다면? 의미없는 fight함수의 오버라이드가 추가되여야 하며

  또, 100개의 도끼를 사용하는 캐릭터를 오버라이드하여 구현해놓았는데, 도끼를 사용하는 방식이 달라진다면?

  100개의 오버라이드 되어있는 함수를 모두 일일이 수정해야 하는 상황이 발생할 수 있다.


- 하지만 이를 캡슐화하여서 'A에는 B가있다' 관계를 통해 추상클래스에 구현체를 포함시켜 상속을 활용하면

  이러한 문제점을 해결할 수 있다.!


☆ 어플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다.

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

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

'디자인패턴' 카테고리의 다른 글

옵저버패턴(Observer Pattern)  (0) 2019.02.10
디자인 패턴 소개.  (0) 2019.02.03

디자인 패턴 소개.

2019. 2. 3. 14:26

1. 디자인원칙

1.1 어플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리 시킨다.

-> 달라지는 부분을 찾아서 나머지 코드에 영향을 주지 않도록 "캡슐화"합니다.

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

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

'디자인패턴' 카테고리의 다른 글

옵저버패턴(Observer Pattern)  (0) 2019.02.10
스트래티지 패턴(strategy pattern)  (0) 2019.02.03

+ Recent posts