Strategy Pattern

์ „๋žต ํŒจํ„ด์€ ์ž์‹ ์˜ ๊ธฐ๋Šฅ ๋งฅ๋ฝ(context)์—์„œ ํ•„์š”์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํ†ต์งธ๋กœ ์™ธ๋ถ€์— ๋ถ„๋ฆฌ์‹œํ‚ค๊ณ , ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌ์ฒด์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํด๋ž˜์Šค๋ฅผ ํ•„์š”์— ๋”ฐ๋ผ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. ๋Œ€์ฒด ๊ฐ€๋Šฅํ•œ ์ „๋žต์ด๋ผ๊ณ  ๋ณด๊ธฐ๋•Œ๋ฌธ์— ์ „๋žต ํŒจํ„ด์ด๋ผ ๋ถˆ๋ฆฐ๋‹ค.

์—ฌ๊ธฐ์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€ ๋…๋ฆฝ์ ์ธ ์ฑ…์ž„์œผ๋กœ ๋ถ„๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•œ๋‹ค.

์ฆ‰, ํ”„๋กœ์ ํŠธ์—์„œ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์—์„œ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„ ๋”ฐ๋กœ ์บก์Аํ™” ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด๋œ๋‹ค.

์˜ˆ์‹œ

ํ† ๋น„์˜ ์Šคํ”„๋ง

UserDao๋Š” ์ „๋žต ํŒจํ„ด์˜ Context์— ํ•ด๋‹นํ•œ๋‹ค. Context๋Š” ์ž์‹ ์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ค‘์—์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ DB์—ฐ๊ฒฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ConnectionMaker ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ •์˜ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ ์ „๋žต์„ ๋ฐ”๊ฟ”๊ฐ€๋ฉด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ถ„๋ฆฌํ–ˆ๋‹ค.

public class UserDaoTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException{
        ConnectionMaker connectionMaker = new DConnectionMaker();

        UserDao dao = new UserDao(connectionMaker);
    }
}
public class UserDao {

    private ConnectionMaker connectionMaker;

    public UserDao(ConnectionMaker connectionMaker) {
        this.connectionMaker = connectionMaker;
    }

    public void add(User user) throws ClassNotFoundException, SQLException {
        Connection c = connectionMaker.makeConnection();
        PreparedStatement ps = c.prepareStatement("insert into users(id, name, password) values(?,?,?)");
        ps.setString(1, user.getId());
        ps.setString(2, user.getName());
        ps.setString(3, user.getPassword());

        ps.executeUpdate();

        ps.close();
        c.close();
    }

    public User get(String id) throws ClassNotFoundException, SQLException {
        Connection c = connectionMaker.makeConnection();
        PreparedStatement ps = c.prepareStatement("select * from users where id = ?");
        ps.setString(1, id);

        ResultSet rs = ps.executeQuery();
        rs.next();

        User user = new User();
        user.setId(rs.getString("id"));
        user.setName(rs.getString("name"));
        user.setPassword(rs.getString("password"));

        rs.close();
        ps.close();
        c.close();

        return user;
    }

}
public interface ConnectionMaker {
    public Connection makeConnection() throws ClassNotFoundException, SQLException;
}
public class DConnectionMaker implements ConnectionMaker{

    @Override
    public Connection makeConnection() throws ClassNotFoundException, SQLException {
        // TODO Auto-generated method stub
        return null;
    }
}

Context(UserDao)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ(UserDaoTest)๋Š” Context๊ฐ€ ์‚ฌ์šฉํ•  ์ „๋žต(DConnectionMaker)์„ Context์˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ œ๊ณตํ•ด์ฃผ๋ฉฐ ์ „๋žตํŒจํ„ด์„ ์ž˜ ์ง€ํ‚ค๊ณ  ์žˆ๋Š” ์˜ˆ์‹œ์ด๋‹ค.

์—ฌ๊ธฐ์„œ ๋ณด๋ฉด UserDao๋Š” ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™(OPC) ์„ ์ž˜ ๋”ฐ๋ฅด๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ์œผ๋ฉฐ, ์ „๋žตํŒจํ„ด์„ ์ ์šฉํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ 

Last updated

Was this helpful?