Я хотел бы спросить ваше мнение, хорошо ли использовать сценарий Bridge в сценарии или нет. Сценарий заключается в том, что нам нужно разработать один универсальный пользовательский интерфейс поиска, который может принимать различные параметры поиска, и на основе этих параметров нам нужно вызывать различные сервисы. Например: если параметры - это номер FIN и имя человека, то мы должны вызвать PersonService для поиска.
Чтобы сделать типобезопасным, я собираюсь использовать паттерн Bridge, где абстракция и реализация могут работать независимо друг от друга.
После реализации приведенного ниже кода я чувствую, что заставляю себя использовать этот шаблон в этом сценарии, даже если этот шаблон плохо подходит для этого ...
Что вы, ребята, думаете? Есть ли способ изменить код, чтобы сделать его лучше? или этот шаблон не может быть использован для этого сценария вообще?
абстрактный класс SearchEngine {
публичный абстрактный IList Query ();
}
class PersonSearchEngine : SearchEngine<Person> {
private DataQuery<Person> dataQuery;
public PersonSearchEngine(DataQuery<Person> dataQuery){
this.dataQuery = dataQuery;
}
public string FIN { set; get; }
public string Name { set; get; }
public override IList<Person> Query() {
return dataQuery.Query(new Person() { FIN = this.FIN, Name = this.Name });
}
}
class LocationSearchEngine : SearchEngine<House> {
private DataQuery<House> dataQuery;
public LocationSearchEngine(DataQuery<House> dataQuery) {
this.dataQuery = dataQuery;
}
public string BlockNumber { set; get; }
public string StreetName { set; get; }
public string HouseNumber { set; get; }
public string PostalCode { set; get; }
public override IList<House> Query() {
return dataQuery.Query(new House() { BlockNumber = this.BlockNumber, StreetName = this.StreetName, HouseNumber = this.HouseNumber, PostalCode = this.PostalCode});
}
}
abstract class DataQuery<T>{
public abstract IList<T> Query(T arg) ;
}
class PersonDataQuery : DataQuery<Person> {
public override IList<Person> Query(Person arg) {
Console.WriteLine("Searching Person.....");
return null;
}
}
class LocationDataQuery : DataQuery<House> {
public override IList<House> Query(House arg) {
Console.WriteLine("Searching Location.....");
return null;
}
}
class Person {
public string FIN { get; set; }
public string Name { get; set; }
}
class House {
public string BlockNumber { set; get; }
public string StreetName { set; get; }
public string HouseNumber { set; get; }
public string PostalCode { set; get; }
}
Использование:
SearchEngine<Person> searchEngine = new PersonSearchEngine(new PersonDataQuery());
searchEngine.Query();
Console.ReadKey();