instanceof를는의는 다음과 같은 상황을 가정 해 봅시다 : 나는복합 패턴과
내가하고 (대한 getName()이있다) "BidComponent"와 같은 추상적 인 슈퍼 클래스를 만들 복합 디자인 패턴으로 입찰 응용 프로그램 (이베이 등)을 설계 할 두 개의 하위 클래스 "Article"과 "Category".
카테고리에는 다른 BidComponents를 포함 할 수있는 목록이 있지만 Article은 List가 아니라 getPrice() 메소드를 구현합니다. 나는이 구조를 반복 할 내가 범주 - 제-구조를 인쇄하려면
내가 instanceof를 필요 : 이것은 나에게 매우 잘못된 것
if(element instanceof Article){
Article article = (Article)element;
System.out.println(article.getName() + ":" + article.getPrice());
}else{
Category category = (Category)element;
System.out.println(category.getName());
}
. 이것을 실현하는 더 좋은 방법이 있습니까 (instanceof를 통해 항상 유형을 확인하지 않고)? 내가 instanceof를를 사용하는 것이 나쁜 디자인이라고 여러 번 읽기 때문에
// 편집 방문자와 내 문제를 언급 ...이 질문 :
좋아. 그러나 모든 제품에 대해 가장 높은 입찰가를 검색하려고한다고 가정 해 봅시다. 그래서 내가 가지고있다
public class HighestBidVisitor implements BidComponentVisitor{
private double highestBid = 0d;
public HighestBidVisitor(Category category){
visitCategory(category);
}
@Override
public void visitCategory(Category category){
Iterator<BidComponent> elementsIterator = category.iterator();
while(elementsIterator.hasNext()){
BidComponent bidComponent = elementsIterator.next();
//Now I have again the problem: I have to check if a component in the Categorylist is an article or a category
if(bidComponent instanceof Article) visitArticle((Article)bidComponent);
else visitCategory((Category)bidComponent);
}
}
@Override
public void visitArticle(Article article){
if(article.getPrice() > highestBid) highestBid = article.getPrice();
}
}
그러나 지금 나는 같은 문제 (visitCategory의 코멘트를 보라)를 다시 가지고있다. 아니면 내가 잘못하고있는거야?
이 나에게 너무 복잡한 것 같다. 스트링을 돌려주는 getDescription() 메소드를 만들지 않고 자체 구현으로 두 클래스에서 오버라이드 (override)하는 것이 어떨까요? –
@ABoschman 당신이 필요로하는 것이'getDescription()'이라면 당신의 솔루션은 작동 할 것입니다. (답을 자유롭게 추가하십시오.)하지만 더 복잡한 것이 필요하다면 도움이되지 않을 것입니다. 방문객은 귀하의 디자인을 확장을 위해 열어 주지만 수정을 위해 닫을 수 있습니다. – NamshubWriter
답변 해 주셔서 감사합니다. 귀하의 솔루션에 대한 문제점을 설명하는 첫 번째 게시물을 편집했습니다 ...이 문제를 해결할 수 있도록 도와 주시겠습니까? – Sotnem