상태 설계 모드 State

4342 단어
현재 강 소 호 는 왕 소 호 에 게 한 학생 이 어떤 학 교 를 다 녀 야 하 는 지 판단 하 는 방법 을 써 달라 고 요구 하고 있다.
왕 씨 는 2 분 후에 코드 를 주 었 습 니 다.
public class Person {
    private int age;

    public Person(int age) {
        this.age = age;
    }

    public void printSchool() {
        if (this.getAge() < 6) {
            System.out.println("  6     !");
        } else if (this.getAge() >=6 && this.getAge() < 11) {
            System.out.println("     !");
        } else if (this.getAge() >= 11 && this.getAge() < 15) {
            System.out.println("     !");
        } else if(this.getAge() >= 15 && this.getAge() < 19) {
            System.out.println("     !");
        } else if (this.getAge() >= 19) {
            System.out.println("     !");
        }
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

강 소 사 이 즈 는 기뻐 하 며 왕 소 사 이 즈 를 한 대 때 렸 다.
만약 강 소 사이즈 가 또 새로운 수요 가 있다 면, 이 학생 이 몇 학년 에 다 니 는 지 판단 할 것 이다.18 개의 판단 가 지 를 쓸 수 는 없 잖 아.이런 표기 법 은 단일 직책 원칙 을 파괴 한 것 이 분명 하 다. 아래 에서 말 하고 자 하 는 상태 디자인 모델 은 복잡성 을 증가 시 켰 지만 확장 하기 쉽 고 대상 을 대상 으로 하 는 디자인 원칙 에 부합된다.
상태 설계 모델 은 이러한 판단 이 너무 많은 문 제 를 해결 하고 책임 분해 의 목적 을 달성 하기 위해 서 이다.
상태 디자인 모델 은 특정한 상태 관련 행 위 를 한 대상 에 넣 고 상태 와 관련 된 모든 코드 가 특정한 State 에 있 기 때문에 새로운 하위 클래스 를 정의 하면 상태 와 전환 을 쉽게 증가 할 수 있다.
개 조 된 코드:
패키지 구조
-state //      
  -states
    -AgeState.java //     
    -PrimaryState.java //  
    -MiddleState.java //  
    -HighState.java //  
    -UniversityState.java //  
  -Person.java
  -PersonTest.java

추상 상태
public abstract class AgeState {

    public abstract void judge(Person person);
}

초등학교 상태
public class PrimaryState extends AgeState {
    @Override
    public void judge(Person person) {
        if (person.getAge() < 6) {
            System.out.println("      6 ,    !");
        } else if (person.getAge() >= 6 && person.getAge() < 11) {
            System.out.println("     !");
        } else {
            person.setAgeState(new MiddleState());
            person.printSchool();
        }
    }
}

중학교 상태
public class MiddleState extends AgeState {
    @Override
    public void judge(Person person) {
        if (person.getAge() >= 11 && person.getAge() < 15) {
            System.out.println("     !");
        } else {
            person.setAgeState(new HighState());
            person.printSchool();
        }
    }
}

고등학교 상태
public class HighState extends AgeState {
    @Override
    public void judge(Person person) {
        if (person.getAge() >= 15 && person.getAge() < 19) {
            System.out.println("     !");
        } else {
            person.setAgeState(new UniversityState());
            person.printSchool();
        }
    }
}

대학 상태
public class UniversityState extends AgeState {
    @Override
    public void judge(Person person) {
        if (person.getAge() >= 19) {
            System.out.println("     !");
        }
    }
}

Person 류
public class Person {

    private int age;
    private AgeState ageState;

    public void printSchool() {
        this.ageState.judge(this);
    }

    public Person(int age) {
        this.age = age;
        this.ageState = new PrimaryState();
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public AgeState getAgeState() {
        return ageState;
    }

    public void setAgeState(AgeState ageState) {
        this.ageState = ageState;
    }
}


테스트:
public class PersonTest {

    public static void main(String[] args) {
        Person p1 = new Person(12);
        p1.printSchool();

        Person p2 = new Person(18);
        p2.printSchool();

        Person p3 = new Person(3);
        p3.printSchool();

        Person p4 = new Person(23);
        p4.printSchool();
    }
}

테스트 출력:
     !
     !
      6 ,    !
     !

이렇게 고치 면 나중에 대학원, 박사, 박사후 에 도 쉽게 확장 할 수 있다.

좋은 웹페이지 즐겨찾기