GiantStepDEV

ํ•ด๋‹น ๋‚ด์šฉ์€ ์•„๋ž˜ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์„ ์ฐธ์กฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

https://memostack.tistory.com/60

 

Design Pattern - Template Method Pattern (ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด)

Template Method Pattern ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์€ ์ผ์ •ํ•œ ๊ตฌ์กฐ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€์ง„ ๊ฒฝ์šฐ, ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ๋””์ž์ธ ํŒจํ„ด ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ์—๋„ ํŽธ๋ฆฌํ•จ. ์ผ์ •ํ•œ ๊ตฌ์กฐ์˜ ํ”„๋กœ์„ธ์Šค? ํŠน์ •

memostack.tistory.com

ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด?

  • ์ผ์ •ํ•œ ๊ตฌ์กฐ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€์ง„ ๊ฒฝ์šฐ, ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ๋””์ž์ธ ํŒจํ„ด
  • ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ , ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ํŽธ๋ฆฌํ•จ.
์ผ์ •ํ•œ ๊ตฌ์กฐ?
ํŠน์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•ญ์ƒ A -> B -> C ์ˆœ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด, ๊ฐ ์ž‘์—…์„ ๋ชจ์•„ ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋กœ ๊ตฌํ˜„

์˜ˆ์ œ

์š”๊ตฌ์‚ฌํ•ญ

- ๊ณ„์ • ๋กœ๊ทธ์ธ์„ ํ•œ๋‹ค.

- ๋กœ๊ทธ์ธ์˜ ๋™์ž‘ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ์‚ฌ์šฉ์ž์˜ id, pw ๋ณตํ˜ธํ™”
  2. ์œ ํšจํ•œ id์™€ pw์ธ์ง€ ํ™•์ธ
  3. ๊ถŒํ•œ ํ™•์ธ
  4. ์ ‘์†

Template Method๋กœ ConnectionManager(๋ถ€๋ชจ ํด๋ž˜์Šค)

import java.util.Map;

public abstract class ConnectionManager {
    protected abstract Map<String, String> decodedInfo(Map<String, String> rawUserInfo);
    protected abstract boolean authentication(String username, String password);
    protected abstract int authorization(String username);
    protected abstract Object getConnection(String username, int authority);

    public Object requestConnection(Map<String, String> rawUserInfo) {
        // 1. ์•”ํ˜ธํ™” ๋œ ์œ ์ € ์ •๋ณด ๋ณตํ˜ธํ™”
        final Map<String, String> userInfo = decodedInfo(rawUserInfo);
        final String username = userInfo.get("username");
        final String password = userInfo.get("password");
        // 2. ์•„์ด๋””์™€ ํŒจ์Šค์›Œ๋“œ ์ธ์ฆ
        if(!authentication(username,password)) {
            throw new RuntimeException("์ธ์ฆ ์‹คํŒจ!");
        }
        // 3. ๊ถŒํ•œ ํ™•์ธ
        final int authority = authorization(username);
        // 4. ์„œ๋น„์Šค ์ ‘์†
        return getConnection(username,authority);
    }
}
  • ๊ณ„์ • ์ ‘์†์„ ์œ„ํ•œ 4๋‹จ๊ณ„๋ฅผ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ(abstract)๋กœ ๋งŒ๋“ ๋‹ค.
  • 4๋‹จ๊ณ„์˜ ๊ฐ ์ž‘์—…์€ ์ƒ์† ๋ฐ›์€ ๊ฐ์ฒด์—์„œ๋งŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก protected ๊ถŒํ•œ์ž ์‚ฌ์šฉ
  • requestConnection() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ถ”์ƒํ™” ํ•ด๋†“์€ 4๊ฐ€์ง€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ˆ˜ํ–‰

DefaultConnection(์ž์‹ ํด๋ž˜์Šค)

package ํ…œํ”Œ๋ฆฟ๋ฉ”์†Œ๋“œ;
import java.util.Map;

public class DefaultConnection extends ConnectionManager {
    @Override
    protected Map<String, String> decodedInfo(Map<String, String> rawUserInfo) {
        System.out.println("์œ ์ € ์ •๋ณด ๋ณตํ˜ธํ™”");
        final Map<String, String> encodedUserInfo = rawUserInfo;
        return encodedUserInfo;
    }

    @Override
    protected boolean authentication(String username, String password) {
        System.out.println("์œ ์ € ์ •๋ณด ์ธ์ฆ ํ™•์ธ");
        if("yang".equals(username)) return true;
        return false;
    }

    @Override
    protected int authorization(String username) {
        System.out.println("๊ถŒํ•œ ์ •๋ณด ํ™•์ธ");
        int authority = 0;
        if("yang".equals(username)) {
            authority = 1;
        }
        switch(authority) {
            case 0 : System.out.println("- ๊ถŒํ•œ : ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž"); break;
            case 1 : System.out.println("- ๊ถŒํ•œ : ๊ด€๋ฆฌ์ž"); break;
            case 2 : System.out.println("- ๊ถŒํ•œ : ์Šˆํผ ๊ด€๋ฆฌ์ž"); break;
            case 3 : System.out.println("- ๊ถŒํ•œ : ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๊ถŒํ•œ"); break;
        }
        return authority;
    }

    @Override
    protected Object getConnection(String username, int authority) {
        System.out.println(username + " ์ ‘์†!");
        final Object connectionObj = new Object();
        return connectionObj;
    }
}
  • ConnectionManager(abstract)์˜ 4๊ฐ€์ง€ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์—ฌ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ตฌํ˜„

Main

package ํ…œํ”Œ๋ฆฟ๋ฉ”์†Œ๋“œ;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        final ConnectionManager cm = new DefaultConnection();

        final Map<String,String> userInfo = new HashMap<>();
        userInfo.put("username", "yang");
        userInfo.put("password", "yangkongmi");

        final Object connectionObj = cm.requestConnection(userInfo);
    }
}
  • requestConnection() ๋ฉ”์†Œ๋“œ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด 4๋‹จ๊ณ„๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•จ.
์œ ์ € ์ •๋ณด ๋ณตํ˜ธํ™”
์œ ์ € ์ •๋ณด ์ธ์ฆ ํ™•์ธ
๊ถŒํ•œ ์ •๋ณด ํ™•์ธ
- ๊ถŒํ•œ : ๊ด€๋ฆฌ์ž
yang ์ ‘์†!

 

profile

GiantStepDEV

@kongmi

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!