개발하는 두더지

[디자인패턴] 스트래티지 패턴(strategy pattern) 본문

이것저것

[디자인패턴] 스트래티지 패턴(strategy pattern)

덜지 2016. 8. 22. 17:25

스트래티지 패턴 (Strategy Pattern)


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


여러가지 포맷으로 파일을 만드는 어플리케이션을 만든다고 생각해보자.


요구사항은 


- A , B 타입의 파일을 생성한다.


- 공통적인 파일의 속성을 출력한다.


- 파일 타입별 정책을 출력한다.


- 파일 생성시 로그를 남긴다. 


등이 있다고 하자.



표준적인 객체지향 기법을 사용하여 UserFile 이라는 슈퍼클래스를 만든다음에 그 클래스를 확장하면서 다양한 파일 포맷 파일을 만든다.


파일의 속성을 출력하는 인터페이스 생성

파일 타입마다 다른 속성을 출력시키기 위해서 분리


ex)

타입1은 파일이름, 생성일자 출력

타입2는 파일이름, 생성일자, 소유자, 마지막수정일자 출력

1
2
3
4
public interface FileProperty
{
    public void print();
}
cs






1
2
3
4
5
6
7
8
9
10
11
public class FileProperty1 implements FileProperty
{
 
    @Override
    public void print()
    {
        // TODO Auto-generated method stub
        System.out.println("File Property 1");
    }
 
}
cs

1
2
3
4
5
6
7
8
9
10
11
public class FileProperty2 implements FileProperty
{
 
    @Override
    public void print()
    {
        // TODO Auto-generated method stub
        System.out.println("File Property 2");
    }
 
}
cs



추상메소드들은 각각의 파일 포맷 객체에서 구현해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
public abstract class UserFile
{
    protected FileProperty m_fileProperty;
    
    abstract protected void createFile();    
    abstract protected void createLog();
    abstract protected void setPolicy();
    public void printFileProperty()
    {
        if(m_fileProperty != null)
            m_fileProperty.print();
    }
    public void create()
    {
        createFile();
        setPolicy();
        createLog();
    }
    
    public void setFileProperty(FileProperty FileProperty)
    {
        m_fileProperty = FileProperty;
    }
}
 
cs



파일타입A

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class FileTypeA extends UserFile
{
    public FileTypeA()
    {
        m_fileProperty = new FileProperty1();
    }
    
    @Override
    protected void createFile()
    {
        // TODO Auto-generated method stub
        System.out.println("FileTypeA Create");
    }
 
    @Override
    protected void createLog()
    {
        // TODO Auto-generated method stub
        System.out.println("FileTypeA Create Success");
    }
 
    @Override
    protected void setPolicy()
    {
        // TODO Auto-generated method stub
        System.out.println("FileTypeA Policy");
    }
 
}
cs

파일타입B

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class FileTypeB extends UserFile
{
    public FileTypeB()
    {
        m_fileProperty = new FileProperty2();
    }
    
    @Override
    protected void createFile()
    {
        // TODO Auto-generated method stub
        System.out.println("FileTypeB Create");
 
    }
 
    @Override
    protected void createLog()
    {
        // TODO Auto-generated method stub
        System.out.println("FileTypeB Create Success");
    }
 
    @Override
    protected void setPolicy()
    {
        // TODO Auto-generated method stub
        System.out.println("FileTypeB Policy");
    }
 
}
cs



메인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Main
{
    public static void main(String[] args)
    {
        UserFile uf = new FileTypeA();
        uf.create();
        uf.printFileProperty();
        
        uf = new FileTypeB();
        uf.create();
        uf.printFileProperty();
        
        FileProperty fileProperty = new FileProperty1();
        uf.setFileProperty(fileProperty);
        
        uf.printFileProperty();
    }
}
cs


결과

FileTypeA Create
FileTypeA Policy
FileTypeA Create Success
File Property 1
FileTypeB Create
FileTypeB Policy
FileTypeB Create Success
File Property 2
File Property 1



Comments