根据满足特定条件时应用策略类。该策略已被选中'原样。战略模式101。
但是,如果有一组类都基于相同的条件应用,那该怎么办呢?从概念上讲,你可以指向一组类并将整个组称为策略,但这种关系并不明确,更重要的是,这些类中的逻辑是精确隔离的,因此他们彼此不了解。他们碰巧在同样的条件下调用。
示例:
public interface BookValidator {
enum PublishType { PAPER_BACK, HARD_COVER, EPUB }
PublishType validationFor();
boolean validate(Book book);
}
class HardcoverBookBindingValidator implements BookValidator {
public PublishType validationFor() { return PublishType.HARD_COVER; }
public boolean validate(Book book) { /* perform validation */ }
}
class HardCoverPaperqualityValidator implements BookValidator {
public PublishType validationFor() { return PublishType.HARD_COVER; }
public boolean validate(Book book) { /* perform validation */ }
}
class EpubSectionsValidator implements BookValidator {
public PublishType validationFor() { return PublishType.EPUB; }
public boolean validate(Book book) { /* perform validation */ }
}
class EpubIndexValidator implements BookValidator {
public PublishType validationFor() { return PublishType.EPUB; }
public boolean validate(Book book) { /* perform validation */ }
}
// etc.
public boolean validateBook(Book book) {
for (BookValidator validator: allBookValidators) {
if (validator.validationFor() == book.type() && !validator.validate(book)) {
return false;
}
}
return true;
}
我看到这种方法很多,有这个名字吗?我倾向于战略模式,只是简单地分离了对它的关注(SRP,高凝聚力),但我不确定。
使用Spring的常见类似方法是为所有发布类型设置一个超类型,然后将Spring inject them放入每种类型的集合中。基本上是一个美化的工厂。重点是:没有单一的策略对象,除非您计算特定类型的对象集合策略。