큰소리 디자인 모델 의 방문 자 모델 총화 - 자바 실현
17495 단어 디자인 모드
다음 코드 가 있다 면
package Test28;
public class Program {
public static void main(String[] args) {
System.out.println(" , 。");
System.out.println(" , 。");
System.out.println(" , , 。");
System.out.println(" , , 。");
System.out.println(" , 。");
System.out.println(" , 。");
}
}
다음은 대상 을 대상 으로 재 구성 코드 를 사용 하여 다음 과 같이 실현 합 니 다.
인류의
package Test28;
//
public abstract class Person {
protected String action;
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
//
public abstract void GetConclusion();
}
남자
package Test28;
//
public class Man extends Person {
//
@Override
public void GetConclusion() {
if (action == " ")
{
System.out.println(this.getClass().getSimpleName()+action+" , 。");
}
else if (action == " ")
{
System.out.println(this.getClass().getSimpleName()+action+" , , 。");
}
else if (action == " ")
{
System.out.println(this.getClass().getSimpleName()+action+" , 。");
}
}
}
여자
package Test28;
//
public class Woman extends Person {
//
@Override
public void GetConclusion() {
if (action == " ")
{
System.out.println(this.getClass().getSimpleName()+action+" , 。");
}
else if (action == " ")
{
System.out.println(this.getClass().getSimpleName()+action+" , , 。");
}
else if (action == " ")
{
System.out.println(this.getClass().getSimpleName()+action+" , 。");
}
}
}
클 라 이언 트 코드
package Test28;
import java.util.ArrayList;
import java.util.List;
public class Program {
public static void main(String[] args) {
List persons = new ArrayList();
Person man1 = new Man();
man1.setAction(" ");
persons.add(man1);
Person woman1 = new Woman();
woman1.setAction(" ");
persons.add(woman1);
Person man2 = new Man();
man2.setAction(" ");
persons.add(man2);
Person woman2 = new Woman();
woman2.setAction(" ");
persons.add(woman2);
Person man3 = new Man();
man3.setAction(" ");
persons.add(man3);
Person woman3 = new Woman();
woman3.setAction(" ");
persons.add(woman3);
for (Person item : persons)
{
item.GetConclusion();
}
}
}
위의 표기 법 은 남자 류 와 여자 류 중 if else 가 너무 많 습 니 다. 그리고 지금 결혼 상 태 를 추가 하려 면 두 가지 모두 분기 판단 을 추가 해 야 합 니 다. 다음은 방문 자 모델 로 재 구성 코드 는 다음 과 같 습 니 다.
상태의 추상 류 와 사람의 추상 류
package Test28;
//
public abstract class Action {
//
public abstract void GetManConclusion(Man concreteElementA);
//
public abstract void GetWomanConclusion(Woman concreteElementB);
}
package Test28;
//
public abstract class Person {
//
public abstract void Accept(Action visitor);
}
구체 적 상태 클래스
package Test28;
//
public class Success extends Action {
@Override
public void GetManConclusion(Man concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName()+this.getClass().getSimpleName()+" , 。");
}
@Override
public void GetWomanConclusion(Woman concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName()+this.getClass().getSimpleName()+" , 。");
}
}
package Test28;
//
public class Failing extends Action {
@Override
public void GetManConclusion(Man concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName()+this.getClass().getSimpleName()+" , , 。");
}
@Override
public void GetWomanConclusion(Woman concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName()+this.getClass().getSimpleName()+" , , 。");
}
}
package Test28;
//
public class Amativeness extends Action {
@Override
public void GetManConclusion(Man concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName()+this.getClass().getSimpleName()+" , 。");
}
@Override
public void GetWomanConclusion(Woman concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName()+this.getClass().getSimpleName()+" , 。");
}
}
package Test28;
//
public class Marriage extends Action {
@Override
public void GetManConclusion(Man concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName()+this.getClass().getSimpleName()+" , : ,‘ ’ 。");
}
@Override
public void GetWomanConclusion(Woman concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName()+this.getClass().getSimpleName()+" , : , 。");
}
}
남자 류 와 여자 류
package Test28;
//
public class Man extends Person {
@Override
public void Accept(Action visitor) {
visitor.GetManConclusion(this);
}
}
package Test28;
//
public class Woman extends Person {
@Override
public void Accept(Action visitor) {
visitor.GetWomanConclusion(this);
}
}
대상 구조 류
package Test28;
import java.util.ArrayList;
import java.util.List;
//
public class ObjectStructure {
private List elements = new ArrayList();
//
public void Attach(Person element)
{
elements.add(element);
}
//
public void Detach(Person element)
{
elements.remove(element);
}
//
public void Display(Action visitor)
{
for (Person e : elements)
{
e.Accept(visitor);
}
}
}
클 라 이언 트 코드
package Test28;
public class Program {
public static void main(String[] args) {
ObjectStructure o = new ObjectStructure();
o.Attach(new Man());
o.Attach(new Woman());
Success v1 = new Success();
o.Display(v1);
Failing v2 = new Failing();
o.Display(v2);
Amativeness v3 = new Amativeness();
o.Display(v3);
Marriage v4 = new Marriage();
o.Display(v4);
}
}
방문 자 모드 는 특정한 대상 구조 에 작용 하 는 각 요소 의 조작 을 나타 내 므 로 각 요소 의 유형 을 바 꾸 지 않 는 전제 에서 이러한 요소 에 작용 하 는 새로운 조작 을 정의 할 수 있 습 니 다.
방문 자 모델 은 데이터 구조 가 상대 적 으로 안정 적 인 시스템 에 적용 되 고 데이터 구조 와 구조 에 작용 하 는 조작 간 의 결합 을 해제 하여 조작 집합 을 상대 적 으로 자 유 롭 게 진화 시 킬 수 있다.
방문 자 모드 의 목적 은 데이터 구조 에서 처 리 를 분리 하 는 것 입 니 다. 많은 시스템 이 알고리즘 과 데이터 구조 에 따라 분 리 될 수 있 습 니 다. 만약 에 이런 시스템 이 비교적 안정 적 인 데이터 구조 와 변화 하기 쉬 운 알고리즘 이 있다 면 방문 자 모드 를 사용 하 는 것 이 적당 합 니 다. 방문 자 모드 로 인해 알고리즘 작업 의 증가 가 쉬 워 집 니 다.구조 대상 은 변화 하기 쉬 우 며 새로운 데이터 대상 이 늘 어 나 면 방문 자 모드 를 사용 하기에 적합 하지 않다.
방문 자 모델 의 장점 은 새로운 조작 을 추가 하 는 것 이 쉽다 는 것 이다. 왜냐하면 새로운 조작 을 추가 하 는 것 은 새로운 방문 자 방문 자 모델 을 추가 하여 관련 행 위 를 한 방문 자 대상 에 집중 시 키 는 것 을 의미 하기 때문이다.
단점 은 새로운 데이터 구 조 를 늘 리 는 것 을 어렵 게 만 드 는 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.