JavaRush /Java Blog /Random-KO /템플릿 전략(전략)

템플릿 전략(전략)

Random-KO 그룹에 게시되었습니다
전략 패턴은 알고리즘 계열을 정의하고 각 알고리즘을 캡슐화하며 상호 교환이 가능하도록 보장합니다. 이를 통해 클라이언트 측에서의 사용과 관계없이 알고리즘을 독립적으로 수정할 수 있습니다(이 정의는 Eric Freeman과 Elizabeth Robson이 쓴 책 "Head First. Design Patterns"에서 가져옴). 이 정의는 약간 혼란스러워 보이기 때문에 이 정의를 일반 언어로 더 자세히 설명해야 합니다 . 종교부터 시작해 보겠습니다 :) 세상에는 많은 종교가 있습니다(고백, 운동, 신념 등). 이것을 코드로 어떻게 설명할 수 있을까요? 예를 들어, 종교 클래스를 선택하고 이 클래스에서 다른 종교를 상속받을 수 있습니다. 불필요한 것들을 추상화하고 Religion 클래스에서 하나의 believe() 메서드를 사용하겠습니다.
public abstract class Religion {
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
다른 모든 종교는 이 클래스에서 상속될 수 있습니다. 우리가 기독교와 이슬람교, 유대교에만 국한했다면 아무런 문제가 없었을 것입니다.
public class Judaism extends Religion {
}
public class Islam extends Religion {
}
public class Christianity extends Religion {
}
그러나 현재 존재하는(또는 이전에 존재했지만 사라진) 다른 종교를 생각하면 적어도 불교도에게는 문제가 발생할 것입니다. 당신은 그들의 믿음 방법을 무시해야 할 것입니다.
public class Buddhism extends Religion {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    };
}
그리고 많은 종교가 있고 그들은 심지어 파스타 괴물(파스타파리안주의)을 믿기 때문에, 이 모든 종교에서는 신앙 방법을 재정의해야 할 것입니다. 하지만 다르게 할 수 있습니까? 이 메서드를 Faith 인터페이스로 이동하고 그 안에 believe 메서드를 구현하고 이 메서드를 각 클래스에 구현합니다(따라서 원하는 대로 각 클래스에 구현합니다). 그러나 그러면 적어도 유대인과 기독교인 사이에서는 코드가 중복될 것입니다. 하나님의 무슬림은 아랍어로 글을 쓸 수 있습니다.
public interface Faith {
    public void believe();
}
public class Christianity implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
public class Judaism implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
여기서는 기본 방식을 구현하는 것이 큰 도움이 되지 않으며, 종교가 너무 많아서 Faith 인터페이스에서 기본 방식을 정의하더라도 모든 비유신교에서는 이 방식을 나름대로 구현하고 반복해야 할 것입니다. 어딘가에. 이 경우 전략 패턴은 우리에게 무엇을 제공합니까? 현재 인터페이스에 대해 미리 만들어진 템플릿 클래스를 생성한 다음 특정 종교의 생성자로 대체됩니다. 저것들. 정의 시작 부분에서 언급한 것과 동일한 알고리즘 계열을 정의하고 생성합니다.
public interface Faith {
    public void believe();
}
public class AbrahamicReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
public class BuddismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    }
}
public class JediismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Да пребудет с вами Сила!");
    }
}
그리고 생성자의 각 클래스에서 이를 대체합니다.
public abstract class Religion {
    Faith faith;
}
public class Judaism extends Religion{

    public Judaism() {
        this.faith = new AbrahamicReligion();
    }
}
public class Christianity extends Religion{

    public Christianity() {
        this.faith = new AbrahamicReligion();
    }
}
public class Buddhism extends Religion {

    public Buddhism() {
        this.faith = new BuddismReligion();
    }
}
따라서 프로젝트에 다른 종교를 포함해야 하는 경우 모든 클래스 또는 클래스의 일부에 대한 신앙 방법을 다시 정의할 필요가 없습니다. 그리고 Faith 인터페이스를 구현하는 누락된 클래스(아직 없는 경우)를 구현하고 이 클래스를 새 종교의 생성자에 추가하기만 하면 됩니다.
public class PastafarianismReligion implements Faith{

    @Override
    public void believe() {
        System.out.println("Кто съел мои макароны???");
    }
}
public class Pastafarianism extends Religion {

    public Pastafarianism() {
        this.faith = new PastafarianismReligion();
    }
}
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION