실례 설명 정책 모드


    최근 에 일이 많 지 않 아서 기 대 했 던 디자인 모델 을 배 울 시간 을 내 서 졸업 한 지 1 년 밖 에 안 된 개발 자로 서 디자인 모델 을 더 알 아 봐 야 한다.
    이 글 은 전략 모델 에 대해 총 결 을 하 였 으 니 여러분 에 게 도움 이 되 기 를 바 랍 니 다.
    (주제: 전략 모델 은 정의 와 간단 한 예 만 보 았 을 뿐 마지막 안개 가 낀 것 을 전혀 몰 랐 습 니 다. 하지만 아래 의 작은 예 는 재 미 있 습 니 다. 전략 모델 이 무엇 인지 잘 이해 할 수 있 습 니 다.)
    사례
    액 션 모험 게임 을 설계 합 니 다. 게임 은 대개 이 렇 습 니 다. 게임 에는 서로 다른 캐릭터 가 있 고 캐릭터 마다 전투 할 때 사용 하 는 무기 가 다 릅 니 다.현재 두 캐릭터: 기사 (Knight) 와 트 롤 머리 (Troll), Knight 의 무 기 는 보검 (Sword), 트 롤 머리 무 기 는 도끼 (Axe);작전 규칙 은 먼저 신분 을 확정 하고 무 기 를 사용 하여 작전 을 하 며 마지막 으로 작전 을 정지한다.
    1. 분석:
       Knight 와 Troll 은 모두 캐릭터 이기 때문에 초 클래스 Character 를 정의 할 수 있 습 니 다.
       캐릭터 의 신원 확인, 무기 사용, 작전 정지, 작전 정지 모두 Character 류 가 가지 고 있 는 방법:
       (1) 각 캐릭터 의 신분, 무기 로 작전 하 는 방식 이 다 르 기 때문에 Character 에서 추상 적 인 방법 (abstract) 으로 정의 하고 하위 클래스 Knight 와 Troll 에서 구체 적 으로 실현 한다.
       (2) 작전 을 정지 하 는 것 은 정지 동작 이기 때문에 character 에서 하위 클래스 의 계승 을 직접 실현 하면 된다.
    2. 상기 분석 코드 에 따라 실현 (기본 적 인 OO 디자인 원칙: 계승, 추상):
         캐릭터 클래스 (초 클래스):
    public abstract class Character {    
    
        public abstract void identify();
        
        public abstract void fight();
        
        public void stopFight(){
            System.out.println("Hi,stop fight and go to sleep,now");
        }
    }

        기사 류 (하위):
    public class Knight extends Character{

        //       
        public void identify() {
            System.out.println("Hi,everybody,I am a handsome Knight");
        }
    
        //       
        public void fight() {
            System.out.println("I fight with Sword the King give me");
        }

    }

        트 롤 두류 (하위):
    public class Troll extends Character{    
    
        public void identify() {
            System.out.println("I am a Troll,I want to control the entire universe");
        }
    
        public void fight() {
            System.out.println("My axe never relented");
        }
    
    }

    3. 요약:
       이때 의 프로 그래 밍 은 OO 디자인 에서 의 계승 과 추상 적 인 원칙 을 만족 시 켰 다. 그러나 후기 에 더 많은 역할 을 추가 해 야 한다 면 모든 캐릭터 가 사용 하 는 무기 가 다 르 거나 원래 의 캐릭터 가 사용 하 는 무 기 를 바 꿔 야 한다 고 생각해 보 자.일부 캐릭터 가 실행 중 무 기 를 교체 할 수 있 도록 설정 하면 프로그램의 유지 에 어려움 이 증가 합 니 다.
    4. 재 분석:
       모든 캐릭터 에 게 서로 다른 무 기 를 사용 하여 작전 을 하 는 것 은 하나의 행위 에 속한다. 상기 디자인 이 실현 하 는 방식 은 캐릭터 류 가 자신의 행 위 를 스스로 집행 하 는 것 이다. 그러면 여러 캐릭터 가 있 을 때 코드 가 지루 하고 통제 하기 어렵 고 독립 성 이 없다.
       차라리 우리 가 변화 하 는 행 위 를 꺼 내 서 지 정 된 클래스 에 단독으로 봉 하고 인터페이스의 형식 으로 정의 하여 각 캐릭터 클래스 에서 해당 하 는 행 위 를 실현 하고 처리 하 는 것 이 낫다.이렇게 하면 후기 에 변화 하 는 것 이 다른 변 하지 않 게 할 수 있다.
    5. 상기 분석 에 따라 정리 코드 를 제시 합 니 다 (OO 디자인 의 패 키 징 과 다 형 을 나 타 냈 습 니 다).
      캐릭터 클래스 (초 클래스):
    public abstract class Character {    
        //  WeaponBehavior 
        protected WeaponBehavior weaponBehavior;
    
        //    
        public Character(){
            
        }
        
        //  fight  ,  WeaponBehavior         
        public void fight(){
            weaponBehavior.useWeanpon();
        }
        
        //    ,    
        public abstract void identify();
        
        //    ,      
        public void stopFight(){
            System.out.println("Hi,stop fight and go to sleep,now");
        }
    
        //    ,                   
        public void setWeaponBehavior(WeaponBehavior weaponBehavior) {
            this.weaponBehavior = weaponBehavior;
        }
    }

     하위 클래스 - 기사 클래스:
    public class Knight extends Character{    
        
        //    ,         
        public Knight(){
            //        
            weaponBehavior = new Sword();
        }
    
        //       
        public void identify() {
            System.out.println("Hi,everybody,I am a handsome Knight");
        }
    
    }

    하위 클래스 - 트 롤 두류:
    public class Troll extends Character{    
        
        //    ,         
        public Troll(){
            //          
            weaponBehavior = new Axe();
        }
    
        public void identify() {
            System.out.println("I am a Troll,I want to control the entire universe");
        }
    
    }

    분 리 된 행동 정의 추상 클래스:
    public interface WeaponBehavior {    
        public void useWeanpon();
    }

    행위 추상 류 의 실현 류 중 하나 인 보검 을 사용 하 는 실현 류:
    public class Sword  implements WeaponBehavior{    
    
        public void useWeanpon() {
            System.out.println("Sword");
        }
    }

    행위 추상 류 의 실현 류 2 - 도끼 를 사용 하 는 실현 류:
    public class Axe  implements WeaponBehavior{    
    
        public void useWeanpon() {
            System.out.println("Axe");        
        }
    }

    행위 추상 류 의 실현 류 의 3 - 새로 추 가 된 화살 실현 류:
    public class BowAndArrow implements WeaponBehavior{    
    
        public void useWeanpon() {
            System.out.println("Bow and Arrow");        
        }
    
    }

    주 방법 호출 테스트:
        //      --  
        Character king = new King();
        king.identify();
        //  
        king.fight();
        king.stopFight();
        
        //      --  
        Character knight = new Knight();
        knight.identify();
        //  
        knight.fight();
        knight.stopFight();
        //    
        knight.setWeaponBehavior(new BowAndArrow());
        knight.fight();
        knight.stopFight();

    실행 결과:
      :        
        I am the king of all
        Sword
        Hi,stop fight and go to sleep,now
        
      :
        Hi,everybody,I am a handsome Knight
        Sword
        Hi,stop fight and go to sleep,now
        Bow and Arrow
        Hi,stop fight and go to sleep,now

2. 관찰자 모델 결합 사례 에 대한 정리
    1. 각 캐릭터 마다 하나의 WeaponBehavior 를 가지 고 서로 다른 무기 사용 작전 을 의뢰 합 니 다. 사실 이것 은       바로 UML 의 조합 (composition) 관계 로 곧 두 가 지 를 결합 하여 사용 할 것 이다.    2. 캐릭터 의 행 위 는 한 그룹 에 포함 되 고 쉽게 확장 되 고 바 뀔 수 있 으 며 심지어 운행 할 때 행 위 를 바 꿀 수 있다.    3. 나타 난 OO 의 포장 (가 변 적 인 행위 의 포장 유형), 추상, 계승, 다 형;
3. 예 에서 나타 난 OO 디자인 중의 일부 디자인 원칙
    설계 원칙:    1. 패 키 징 변화: 응용 에서 변화 가 필요 할 수 있 는 부분 을 찾 아 독립 시 키 고 변화 가 필요 없 는 코드 와 섞 이지 마 세 요.    (1) 변화 할 수 있 는 부분 을 '포장' 하여 변화 가 필요 없 는 다른 부분 이 변화 부분의 영향 을 받 지 않도록 한다.    (2) 장점: 코드 변화 로 인 한 부주의 한 결과 가 적어 지고 시스템 이 더욱 탄력 적 으로 변 한다.    2. 인터페이스 프로 그래 밍 에 대해 프로 그래 밍 을 실현 하지 않 는 다.    (1) 인터페이스 프로 그래 밍 에 대한 진정한 의 미 는 초 유형 (supertype) 프로 그래 밍 이다.    (2) 관건: 다 태 활용;    (3) 특정한 종 류 는 이러한 종류 나 하위 클래스 에 정의 되 지 않 고 가 변 적 인 행동 동작 인 '위탁 (delegate)' 의 다른 종 류 를 처리 합 니 다.    3. 조합 을 많이 사용 하고 계승 을 적 게 사용한다.    (1) 조합 장점 사용: 시스템 을 더욱 탄력 있 게 하고 알고리즘 족 (한 조 의 행위) 을 클래스 로 포장 할 수 있 을 뿐만 아니 라         실행 시 동적 액 변경 행위 (알고리즘) 를 수행 합 니 다.
4. 본 고의 중점 - 전략 모델 의 정의:
    **첫 번 째 디자인 모델: 전략 모델 (Strategy pattern)    공식 정의:    전략 모델 은 알고리즘 족 을 정의 하고 각각 밀봉 하여 그들 사이 에 서로 바 꿀 수 있 도록 합 니 다. 이 모델 은 알고리즘 의 변 화 를 알고리즘 을 사용 하 는 고객 에 게 독립 시 킵 니 다.        디자인 모델 의 장점 학습:    1. 사고 구조의 차원 을 모델 차원 으로 향상 시 킬 수 있 고 사소한 대상 에 만 머 무 르 지 않 는 다.    2. 모델 은 더 적은 어휘 로 충분 한 의사 소통 을 할 수 있 습 니 다.    3. 유지 가능 한 OO 시스템 을 구축 하려 면 시스템 이 앞으로 필요 로 할 변화 와 변화 에 대처 하 는 원칙 을 수시로 생각 하 는 것 이 중요 하 다.

좋은 웹페이지 즐겨찾기