Refactoriser if instanceof / else if instancecof Utilisation du modèle de visiteur
Le modèle de visiteur est l'un des modèles de conception comportementaux. Visitor Pattern fournit des fonctionnalités à notre structure depuis l'extérieur. Ce que je veux dire, c'est qu'en utilisant Visitor Pattern, vous fournissez certaines fonctionnalités à votre conception, telles que des fonctionnalités qui changent en fonction du type de classe.
Supposons que nous ayons un service qui ajoute des données aux pages PowerPoint selon des types donnés. Nous prenons en charge trois types de texte, tableau et vidéo. Lorsque nous avons créé cette application pour la première fois, nous avons utilisé la méthode "instanceof" pour la situation conditionnelle. Les objets Video, Text et Table héritent de la même classe Parent. Nous avons effectué une opération appropriée en vérifiant le type d'objet à l'aide de la méthode "instanceof". Par exemple, si l'instance pageType de Text, nous avons ajouté du texte à une page. Mais cette méthode n'est pas durable car si vous avez besoin d'un nouveau type de contenu, vous devez ajouter une condition et un corps pour ce type. C'est pourquoi nous sélectionnons le modèle de visiteur.
Mettons nos mains un peu dans le cambouis
Tout d'abord, créons une interface appelée PowerPointContentVisitor et créons la classe concrète PowerPointContentVisitorImpl. Cette classe est chargée de gérer l'ajout d'éléments au fonctionnement de la page. En faisant cela, nous avons séparé les opérations d'ajout d'éléments et cela est devenu plus facile à gérer.
public interface PowerPointContentVisitor {
void visit(POIText poiText);
void visit(POIImage poiImage);
void visit(POITable poiTable);
}
@Service
@Slf4j
public class PowerPointContentVisitorImpl implements PowerPointContentVisitor{
@Override
public void visit(POIText poiText) {
log.info("Operations for text");
}
@Override
public void visit(POIImage poiImage) {
log.info("Operations for image");
}
@Override
public void visit(POITable poiTable) {
log.info("Operations for table");
}
}
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import lombok.Data;
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
property = "type"
)
@JsonSubTypes({
@Type(value = POIText.class, name = "text"),
@Type(value = POIImage.class, name = "image"),
@Type(value = POITable.class, name = "table"),
})
@Data
public abstract class POIPage {
private String title;
abstract void accept(PowerPointContentVisitor powerPointContentVisitor);
}
public class POIText extends POIPage{
@Override
void accept(PowerPointContentVisitor powerPointContentVisitor) {
powerPointContentVisitor.visit(this);
}
}
public class POIImage extends POIPage {
@Override
void accept(PowerPointContentVisitor powerPointContentVisitor) {
powerPointContentVisitor.visit(this);
}
}
public class POITable extends POIPage{
@Override
void accept(PowerPointContentVisitor powerPointContentVisitor) {
powerPointContentVisitor.visit(this);
}
}
@RestController
@RequiredArgsConstructor
public class PageController {
private final PowerPointContentVisitor powerPointContentVisitor;
@PostMapping("/pptx/pages/")
public void addPage(@RequestBody List<POIPage> poiPages) {
poiPages.forEach(poiPage -> poiPage.accept(powerPointContentVisitor));
}
}
[
{
"title": "Text Page",
"type": "text"
},
{
"title": "Image Page",
"type": "image"
},
{
"title": "Table Page",
"type": "table"
}
]
![Qu'est-ce qu'une liste liée, de toute façon? [Partie 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































