在这种情况下使用Bridge?

时间:2009-07-15 01:35:26

标签: design-patterns

我想问你的意见是否在场景中使用Bridge模式是好的。场景是我们需要开发一个可以接受不同搜索参数的通用搜索UI,并且基于这些参数,我们需要调用不同的服务。例如:如果参数是FIN编号和Person的名称,那么我们将不得不调用PersonService进行搜索。

为了使类型安全,我正在考虑使用Bridge模式,抽象和实现可以独立工作。

在实现下面的代码后,我觉得我强迫自己在这种情况下使用该模式,即使这种模式不适合这个......

你们觉得怎么样?有没有办法改变代码,使其更好?或者这种模式根本不能用于这种情况?

抽象类SearchEngine {         public abstract 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();

1 个答案:

答案 0 :(得分:0)

如果搜索始终路由到单个子系统。路由模式怎么样。

如果多个子系统的搜索结果聚合。聚合器模式怎么样。