이 글은 주로 자바디자인 패턴의 템플릿 메소드 패턴에 대한 관련 정보를 소개하고 있습니다. 관심 있는 친구들은 참고해보세요
1. 템플릿 메소드 패턴이란
개념 : 일부 단계를 하위 클래스로 연기하면서 작업에서 알고리즘의 골격을 정의합니다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의할 수 있습니다.
일반인의 관점에서 템플릿 메소드 패턴은 변경되지 않은 동작을 슈퍼 클래스로 이동하고 하위 클래스에서 중복 코드를 제거하여 좋은 코드 재사용 플랫폼을 제공합니다. 불변 메소드와 가변 메소드가 서브클래스에 섞여 있으면 서브클래스에 불변 메소드가 여러 번 나타나게 되므로 하나의 메소드를 수정해야 한다면 여러 메소드를 수정해야 하지만 이 문제는 그 부분에서 생각해 보아야 합니다. 디자인의 시작. 이때 템플릿 메소드 패턴이 작동하게 되는데, 템플릿 메소드 패턴을 통해 이러한 반복되는 메소드를 한 곳으로 이동시켜 서브클래스가 반복의 얽힘을 제거하는 데 도움이 될 수 있습니다.
이해하기 쉬운 예를 들자면, 제가 어렸을 때 저자의 집은 가난했습니다. 시골 초등학교에 다닐 때 학교에 돈이 없었기 때문에 학생들은 모두 손으로 시험지를 써야 했습니다. 당시 인쇄된 시험지. 그 수업에는 50명 이상의 학생이 있었는데, 각 학생은 칠판에 시험지를 반복해서 복사해야 했고, 나 같은 근시안적인 사람은 쉽게 8이 3이 되고, 7이 1이 되는 등의 실수를 하게 되었습니다. 맞췄는데 점수가 높지 않아서 항상 꼴찌였어요. 이것은 매우 심각한 복제 및 불변성 문제입니다. 이제 학생들은 시험지를 복사할 필요가 없습니다. 템플릿 방법은 비슷합니다.
2. 모드 비교
1. 시험지 복사 모드
저자는 반복으로 인해 발생하는 불편함을 시험지 복사 모드라는 이름으로 설명하고 있습니다.
A학생이 복사한 시험지
public class TestPaperA { //试卷第一题 public void testQuestion1(){ System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈"); System.out.println("答案:C"); } //试卷第二题 public void testQuestion2(){ System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛"); System.out.println("答案:C"); } //试卷第三题 public void testQuestion3(){ System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴"); System.out.println("答案:B"); } }
B학생이 복사한 시험지
public class TestPaperB { //试卷第一题 public void testQuestion1(){ System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈"); System.out.println("答案:A"); } //试卷第二题 public void testQuestion2(){ System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛"); System.out.println("答案:C"); } //试卷第三题 public void testQuestion3(){ System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴"); System.out.println("答案:D"); } }
클라이언트 코드
public class ShowAnswer { public static void main(String[] args) { System.out.println("学生甲的试卷"); TestPaperA stuA = new TestPaperA(); stuA.testQuestion1(); stuA.testQuestion2(); stuA.testQuestion3(); System.out.println("学生乙的试卷"); TestPaperB stuB = new TestPaperB(); stuB.testQuestion1(); stuB.testQuestion2(); stuB.testQuestion3(); } }
위의 두 학생이 복사한 시험지에는 다음과 같이 중복된 내용이 많이 있음을 쉽게 알 수 있습니다. 시험지의 문제와 답안을 출력하는 방식이 학생 시험지 카테고리별로 뒤섞여 있어서 유지관리나 검색에 도움이 되지 않는데, 템플릿 방식 패턴이 어떻게 개선되었는지 살펴보겠습니다.
2. 템플릿 방식 모드
학생별 시험지, 문제, 답변 등의 반복되는 부분을 추출합니다.
먼저 시험지 클래스를 변형하여 추상 클래스로 변경합니다. 이 클래스에서는 하위 클래스 구현을 위해 세 가지 추상 메서드를 추가했습니다. 학생들은 모두 대답해야 하지만 대답이 다르기 때문에 대답하는 과정은 다음과 같습니다. 반복되고 변하지 않는 방법으로 추출되었으며 코드는 다음과 같습니다.
public abstract class TestPaper { //试卷第一题 public void testQuestion1(){ System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈"); System.out.println("答案:" + answer1()); } //试卷第二题 public void testQuestion2(){ System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛"); System.out.println("答案:" + answer2()); } //试卷第三题 public void testQuestion3(){ System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴"); System.out.println("答案:" + answer3()); } //这三个钩子方法是给每个子类去实现,并返回答案的 public abstract String answer1(); public abstract String answer2(); public abstract String answer3(); //模板方法,考试的过程,定义基本的考试过程,子类回调 public void exam(){ testQuestion1(); testQuestion2(); testQuestion3(); } }
먼저 첫 번째 학생의 시험 상황을 살펴보겠습니다
public class TestPaperA extends TestPaper{ @Override public String answer1() { return "A"; } @Override public String answer2() { return "B"; } @Override public String answer3() { return "D"; } }
다른 학생들의 시험지 답안은 다를 수 있지만 기본적인 답안 과정은 동일하므로 클라이언트 코드는 반복하지 않겠습니다. 아래에.
public class ShowAnswer { public static void main(String[] args) { TestPaper testPaper = new TestPaperA(); testPaper.exam(); } }
클라이언트 코드도 많이 단순화된 것을 볼 수 있습니다. 이로 인해 로직이 명확해지고 유지 관리가 쉬워졌습니다. 구체적인 답변을 살펴보겠습니다.
샤오롱누는 양궈의 어떤 친척인가요? () A. 작은 이모 B. 큰 이모 C. 이모 D. 이모
답변: A
전전종의 첫 번째 종파는 누구였나요? A. Zhou Botong B. Ouyang Feng C. Wang Chongyang D. Ximen Brag
답변: B
'드래곤'에서 남 캠퍼스의 왕으로 명명된 영웅은 누구입니까? A. Duan Yu B. Qiao Feng C. Murong Fu D. Duan Zhixing
답변: D
3. 템플릿 메서드 패턴의 기본 구조
AbstractClass는 실제로 추상 템플릿인 추상 클래스입니다. 템플릿 메소드를 정의하고 구현했습니다. 이 템플릿 메소드는 일반적으로 논리적 뼈대를 제공하는 구체적인 구현이며 논리적 구성은 해당 추상 클래스에 있으며 이는 하위 클래스 구현으로 연기됩니다. 코드는 다음과 같습니다
public abstract class AbstractClass { //一些抽象行为,可以理解为重复不变的方法,提取到抽象类 public abstract void primitiveOperation1(); public abstract void primitiveOperation2(); //模板方法,给出了具体逻辑的骨架,而逻辑的组成是一些相应的抽象操作,他们都推迟到子类实现 public void templateMothed(){ primitiveOperation1(); primitiveOperation2(); } }
ConcreteClass는 상위 클래스에서 정의한 하나 이상의 추상 메서드를 구현합니다. 각 AbstractClass는 이에 대응하는 하나 이상의 ConcreteClass를 가질 수 있으며, 각 ConcreteClass는 이러한 추상 메서드의 다양한 구현(즉, 뼈대 단계)을 제공할 수 있으므로 획득되는 구현이 다릅니다.
public class ConcreteClassA extends AbstractClass{ @Override public void primitiveOperation1() { System.out.println("子类A的操作1"); } @Override public void primitiveOperation2() { System.out.println("子类A的操作2"); } }
public class ConcreteClassB extends AbstractClass{ @Override public void primitiveOperation1() { System.out.println("子类B的操作1"); } @Override public void primitiveOperation2() { System.out.println("子类B的操作2"); } }
위에 두 가지 특정 구현이 정의되어 있습니다. 실제로 더 많은 구현이 동일하므로 여기서는 자세히 설명하지 않겠습니다. 클라이언트 코드를 살펴보겠습니다
public class Show { public static void main(String[] args) { AbstractClass c; c = new ConcreteClassA(); c.templateMothed(); c = new ConcreteClassB(); c.templateMothed(); } }
다음을 입력하세요
서브클래스 A의 작업 1
서브클래스 A의 작업 2
서브클래스 B의 작업 1
서브클래스 B의 작업 2
4.
템플릿 메소드 패턴은 반복되고 변하지 않는 코드를 추상 클래스로 추출하는 것입니다. 특정 세부 수준에서는 일관된 프로세스나 일련의 단계를 완료하고 싶지만 더 세부적인 수준에서 개별 단계의 구현이 다를 수 있는 경우 일반적으로 이를 처리하기 위해 템플릿 메서드 패턴을 사용하는 것을 고려합니다.
위 내용은 자바 디자인 패턴의 템플릿 메소드 패턴에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!