HeadFirst 디자인 모드 학습 노트

원칙.
  • 응용 에서 변화 가 필요 한 점 을 찾아내 고 변화 점 을 독립 시 켜 변동 이 필요 없 는 부분 과 분리 한다
  • 인터페이스 프로 그래 밍 을 위 한 것 이지 프로 그래 밍 을 위 한 것 이 아니다
  • 다 용도 조합, 소 용도 계승
  • 디자인 모드
    전략 모드 (strategy pattern)
    실례
    우선 추상 류 와 인 터 페 이 스 를 정의 한다.
    public abstract class Duck {
        private FlyBehavior flyBehavior;
        public void performFly(){
            flyBehavior.fly();
        }
    
        public void performQuack(){
            quackBehavior.quack();
        }
    
        public void display(){
            System.out.println("hey , i am a duck!");
        }
    }
    ---------------------------------------------------------
    public interface FlyBehavior {
        void fly();
    }
    

    그리고 구체 적 인 유형 을 정의 하고 인 터 페 이 스 를 실현 한다.
    public class FlyNoWay implements FlyBehavior {
        @Override
        public void fly() {
            System.out.println("oh, i cannot fly!");
        }
    }
    public class FlyRocketPower implements FlyBehavior {
        @Override
        public void fly() {
            System.out.println("i can fly ~~~~");
        }
    }
    public class ModelDuck extends Duck {
    
        public ModelDuck() {
            this.setFlyBehavior(new FlyNoWay());
        }
    }

    쓰다
    public class Main {
        public static void main(String[] args) {
    
            System.out.println("-------- God made a model duck with mud --------");
    
            Duck duck = new ModelDuck();
    
            duck.display();
            duck.performFly();
    
            System.out.println("-------- God gives the  model duck the ability to fly --------");
    
            duck.setFlyBehavior(new FlyRocketPower());
            duck.performFly();
        }
    }

    분석 하 다.
    오리 에 게 비행 능력 은 일종 의 변동 능력 으로 어떤 오 리 는 날 수 있 지만 어떤 오 리 는 날 수 없다.만약 에 Duck 이라는 추상 류 에서 오리 의 비행 능력 을 직접 정의 하면 적당 하지 않다.비행 능력 을 하나의 인터페이스 로 추상 화하 여 비행 할 수 있 는 모든 오리 가 이 인 터 페 이 스 를 계승 하도록 한다 면 문제 가 존재 할 것 이다. 즉, 비행 할 수 있 는 모든 오 리 는 이 인터페이스의 비행 방법 을 실현 하여 비행 이라는 기능 에 코드 가 중복 되 어야 한 다 는 것 이다.따라서 전략 모델 에서 이러한 방법 을 사용한다. 즉, 비행 능력 을 하나의 인터페이스 로 추상 화하 지만 이 인 터 페 이 스 는 조합 형식 으로 Duck 의 필드 로 하고 Duck 내부 에서 performFly 방법 으로 인 터 페 이 스 를 호출 한다.이렇게 하 는 장점 은 상황 에 따라 서로 다른 비행 행 위 를 서로 다른 Duck 서브 클래스 에 주입 할 수 있 고 프로그램 이 실 행 될 때 비행 행 위 를 동적 으로 교체 할 수 있다 는 것 이다.
    관찰자 모드
    실례
    정의 인터페이스
    public interface Subject{
          public void registerObserver(Observer o);
          public void deleteObserver(Observer o);
          public void notifyAllObservers();
    }
    
    public interface Observer{
         public void update(float temperature);
    }

    인터페이스 구현
    public class MySubject implements Subject{
            ArrayList observers;
            float temperature;
            public MySubject(){
                   observers=new ArrayList();
            }
            public void registerObserver(Observer o){
                   observers.add(o);
            }
            public void deleteObserver(Observer o){
                  int index=observers.indexof(o);
                  if(index>=0)observers.remove(index);
            }
            public void notifyAllObservers(){
                 for(Observer o:observers)o.update(temperature,humidity,pressure);
            }
            public void setMeasurements(float temperature){
                 this.temperature=temperature;
                 notifyAllObservers();
            }
    }
    
    public  class MyObserver implements Observer{
              Subject subject;
              public MyObserver(Subject s){
                   this.subject=s;
                   s.registerObserver(this);
              }
            public void update(float temperature){
                   System.out.println("    subject   ");
            }
    }

    쓰다
    MySubject ms=new MySubject();
    Observer o=new MyObserver(ms);
    //          MySubject    ,       Observer      
    ms.setMeasurements(temperature); 

    분석 하 다.
    두 가지 역할: subject 와 observer.observer 구독 subject, subject 의 데이터 가 변화 가 있 을 때 이미 구독 한 observer 에 전송 할 수 있 습 니 다.그리고 이 두 가지 역할 은 모두 인터페이스의 형식 으로 정의 된다.관건 은 subject 에서 이 subject 를 구독 한 모든 observer 목록 을 유지 하고 있 습 니 다.observer 에는 subject 를 가리 키 는 인용 이 포함 되 어 있 습 니 다.자바 종 에 도 observable 추상 류 와 observer 인터페이스 가 존재 하 며 각각 관찰자 모드 의 subject 인터페이스 와 observer 인터페이스 에 대응 합 니 다.또한, observable 에 서 는 notify Observer () 방법 을 호출 하기 전에 setChange () 방법 을 사용 하여 상태 변 화 를 표시 하 는 플래그 위 치 를 true 로 설정 해 야 합 니 다.notify Observer () 방법 은 내부 에서 표지 의 위치 가 true 인지 아 닌 지 를 판단 할 수 있 습 니 다. 재위 true 의 경우 에 만 진정 으로 관찰자 에 게 알 릴 수 있 습 니 다 (observable 은 추상 적 인 유형 이 고 자바 는 단일 계승 이기 때문에 일정한 상황 에서 제한 이 있 습 니 다).

    좋은 웹페이지 즐겨찾기