시냅스

전략 패턴 Strategy Pattern - Java로 구현 본문

디자인 패턴

전략 패턴 Strategy Pattern - Java로 구현

ted k 2022. 8. 2. 19:39

전략 패턴 Strategy Pattern

  • 정책이나 알고리즘을 교체하여 사용할 수 있음
  • 다양한 알고리즘이 존재하면 이들 각각을 하나의 클래스로 캡슐화하여 알고리즘의 대체가 가능하도록 한다.
  • 클라이언트와 독립적인 다양한 알고리즘을 적용할 수 있도록 한다.
  • 사용자가 모르고 있는 데이터를 사용하여 여러 정책들이 반영될 수 있도록 구현
  • 여러 정책이 수행되어야 하는 조건들 (if-else, switch) 문이 없어질 수 있다

 

 

  • Strategy
    • 정책이 수행해야 하는 기능들을 인터페이스로 선언
  • ConcreteStrategy
    • Strategy에 선언된 여러 기능들을 구현
    • 다양한 정책들이 구현될 수 있음
  • Context
    • 어떤 ConcreteStrategy 가 수행 될 것인지에 따라 정책을 선택한다
    • Strategy에 선언된 메서드 기반으로 접근한다.
    • Strategy 클래스와 Context 클래스는 선택한 알고리즘이 동작하도록 협력한다.

 

구현

package strategypattern;

import java.util.ArrayList;

interface PointStrategy {
    public void showGradeInfo(Subject subject);
}

class MinorStrategy implements PointStrategy {
    @Override
    public void showGradeInfo(Subject subject) {
        int score = subject.getScorePoint();
        if (score >= 90)
            System.out.println(subject.getName() + "과목 성적은 " + score + "점 이고, 학점은 A입니다.");
        else if (score >= 80)
            System.out.println(subject.getName() + "과목 성적은 " + score + "점 이고, 학점은 B입니다.");
        else if (score >= 70)
            System.out.println(subject.getName() + "과목 성적은 " + score + "점 이고, 학점은 C입니다.");
        else if (score >= 55)
            System.out.println(subject.getName() + "과목 성적은 " + score + "점 이고, 학점은 D입니다.");
        else
            System.out.println(subject.getName() + "과목 성적은 " + score + "점 이고, 학점은 F입니다.");
    }
}

class MajorStrategy implements PointStrategy {

    @Override
    public void showGradeInfo(Subject subject) {
        int score = subject.getScorePoint();
        if (score >= 95)
            System.out.println(subject.getName() + "과목 성적은 " + score + "점 이고, 학점은 S입니다.");
        else if (score >= 90)
            System.out.println(subject.getName() + "과목 성적은 " + score + "점 이고, 학점은 A입니다.");
        else if (score >= 80)
            System.out.println(subject.getName() + "과목 성적은 " + score + "점 이고, 학점은 B입니다.");
        else if (score >= 70)
            System.out.println(subject.getName() + "과목 성적은 " + score + "점 이고, 학점은 C입니다.");
        else if (score >= 60)
            System.out.println(subject.getName() + "과목 성적은 " + score + "점 이고, 학점은 D입니다.");
        else
            System.out.println(subject.getName() + "과목 성적은 " + score + "점 이고, 학점은 F입니다.");
    }
}

class Subject {
    private String name;
    private int scorePoint;
    private boolean majorCode;
    private PointStrategy ps;

    public PointStrategy getPs() {
        return ps;
    }

    public void setPs(PointStrategy ps) {
        this.ps = ps;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScorePoint() {
        return scorePoint;
    }

    public void setScorePoint(int scorePoint) {
        this.scorePoint = scorePoint;
    }

    public boolean isMajorCode() {
        return majorCode;
    }

    public void setMajorCode(boolean majorCode) {
        this.majorCode = majorCode;
    }
}

class Student {
    int studentID;
    String studentName;
    ArrayList<Subject> subjectList;

    public static final int BASIC = 0;
    public static final int MAJOR = 1;

    public Student(int studentID, String studentName) {
        this.studentID = studentID;
        this.studentName = studentName;
        subjectList = new ArrayList<>();
    }

    public void addSubject(String name, int score, boolean majorCode) {
        Subject subject = new Subject();
        if (majorCode == true)
            subject.setPs(new MajorStrategy());
        else
            subject.setPs(new MinorStrategy());
        subject.setName(name);
        subject.setScorePoint(score);
        subject.setMajorCode(majorCode);
        subjectList.add(subject);
    }

    public void showGradeInfo() {
        for (Subject subject : subjectList) {
            subject.getPs().showGradeInfo(subject);
        }
    }
}

public class StrategyPattern {
    public static void main(String[] args) {
        Student studentLee = new Student(1001, "Lee");
        studentLee.addSubject("국어", 100, false);
        studentLee.addSubject("수학", 100, true);

        Student studentKim = new Student(1002, "Kim");
        studentKim.addSubject("국어", 55, true);
        studentKim.addSubject("수학", 55, false);
        studentKim.addSubject("영어", 100, false);

        studentLee.showGradeInfo();
        studentKim.showGradeInfo();
    }
}

 

 

Comments