#include <iostream>
using namespace std;
// 디자인의 대전제: 모든 코드는 유지보수와 기능확장이 쉽도록 유연하게 설계되어야 한다.
// OCP : Open Closed Principle
// 기능확장에 열려있고 코드변경에 닫혀 있어야 한다.
// 생각해 볼 만한 문제.. 오목게임을 만들고 싶다. - 1인용.
// 다음 수를 예측하는 알고리즘은 자주 변경 될 수 있을 거 같다.
// 1. 변하는 것은 따로 캡슐화를 해라. - 오목과 다음 수 예측알고리즘을 분리한다.
// 2. 상속 대신에 포함을 사용하라. ( 상속은 너무 경직 되어 있다. 떼어다 붙여다가 안된다. )
// 3. 구현이 아닌 인터페이스를 사용해서 객체와 통신해라.( Loosely Coupling )
// 결국 아래코드가 GOF의 디자인패턴에 나오는 "전략패턴" 이다.
// 알고리즘(변하는요소를) 캡슐화
// 인터페이스를 먼저 설계한다.
struct IStrategy
{
public:
virtual void NextPos( int(*p)[19], int* px, int* py ) = 0;
};
// 다음 수만 예측하는 알고리즘
class Level1 : public IStrategy
{
public:
virtual void NextPos( int* px, int* py )
{
}
};
class Omok
{
int board[19][19];
IStrategy* pComputer; // Composition( 포함, 구성)
public:
void Run()
{
// 컴퓨터에게 다음 수를 두게 한다.
int x, y;
// Delegation(위임)이라고 부른다.
pComputer->NextPos( board, &x, &y );
}
// 동적으로 알고리즘을 변경할 수 있게 한다.
void SetStrategy( IStrategy* p ) { pComputer = p; }
};
void main()
{
}
/*
// 잘못된 방식
class Omok
{
public:
virtual void NextPos( int* px, int* py )
{
}
};
class Level1 : public Omok
{
virtual void NextPos( int* px, int* py )
{
}
};
void main()
{
Omok* p = new Level1;
p->NextPos();
}
*/