Strategy pattern keeps context while changes the strategy in needs.

스크린샷 2018-11-18 오후 8.13.58

public void jdbcContextWithStatementStrategy(StatementStrategy stmt) throws SQLException {
    Connection c = null;
    PreparedStatement ps =null;
    try {
        c = dataSource.getConnection();
        ps = stmt.makePreparedStatement(c);
        ps.executeUpdate();
    } catch (SQLException e) {
        throw e;
    } finally {
        if (ps != null) { try { ps.close(); } catch (SQLException e) {} }
        if (c != null) { try { c.close(); } catch (SQLException e) {} }
    }
}

위에서 정의한 컨텍스트를 적용할 클라이언트 메소드를 만들어 보자.

public void add(final User user) throws SQLException {
    StatementStrategy strategy = new StatementStrategy() {
        public PreparedStatement makePreparedStatement(Connection c) throws SQLException {
            PreparedStatement ps = c.prepareStatement("insert into users(id, name, password) values(7 , 7, 7)");
            ps.setString(1 , user.getld());
            ps.setString(2, user.getName());
            ps.setString(3, user.getPassword());

            return ps;
        }
    };
    jdbcContextWithStatementStrategy(st);
}

위와 같이 전략을 생성할 때 로컬 익명 클래스를 사용하게 되면 두 가지 이점이 있다. 하나는 클래스 파일이 많아지는 것을 막을 수 있다. 둘째는 위 코드에서 user와 같이 전략에 필요한 데이터가 있을 경우, 이를 별도 생성자를 통해 주입 받지 않고, Closure 개념을 통해 user에 바로 접근할 수가 있다.

출처: 토비의 스프링31Vol1

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

search previous next tag category expand menu location phone mail time cart zoom edit close