HeadFirst 디자인 모드 학습 노트
8898 단어 head-first-java디자인 모드
전략 모드 (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 은 추상 적 인 유형 이 고 자바 는 단일 계승 이기 때문에 일정한 상황 에서 제한 이 있 습 니 다).
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 에 대한 인식 (1)대상 을 만 드 는 데 사용 할 인 터 페 이 스 를 정의 하여 하위 클래스 가 어떤 종 류 를 예화 할 지 결정 합 니 다.Factory Method 는 클래스 의 실례 화 를 하위 클래스 로 지연 시 킵 니 다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.