일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Galera Cluster
- Algorithm
- c언어
- 파이썬
- 네트워크
- Kafka
- 디자인 패턴
- Heap
- MSA
- OS
- Proxy
- spring webflux
- 자료구조
- Java
- JPA
- MySQL
- redis
- C
- 컴퓨터구조
- design pattern
- Data Structure
- 알고리즘
- 백준
- 자바
- react
- IT
- 운영체제
- JavaScript
- Spring
- mongoDB
Archives
- Today
- Total
시냅스
전략 패턴 Strategy Pattern - Java로 구현 본문
전략 패턴 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();
}
}
'디자인 패턴' 카테고리의 다른 글
옵저버 패턴 Java로 구현 (0) | 2022.08.17 |
---|---|
템플릿 메소드 패턴 Java로 구현 (0) | 2022.08.17 |
State Pattern - java로 구현 (0) | 2022.08.02 |
데코레이터 패턴, Decorator Pattern Java로 구현 (0) | 2022.07.25 |
팩토리 메소드 패턴 Java로 구현 (0) | 2022.07.25 |
Comments