2012-02-23 2 views
1

Предположим, у меня есть какой-то толстый интерфейс, который нельзя изменить. А также у меня есть какой-то клиентский класс, который хочет использовать только несколько методов из этого толстого интерфейса. Как можно реализовать шаблон адаптера для этой ситуации, чтобы достичь принципа разделения сегментов интерфейса?Как я могу отделить жирный интерфейс посредством реализации шаблона адаптации?

ответ

9

Это довольно просто. Вам нужно что-то вроде этого:

interface IAmFat 
{ 
    void Method1(); 
    void Method2(); 
    ... 
    void MethodN(); 
} 

interface IAmSegregated 
{ 
    void Method1(); 
} 

class FatAdapter : IAmSegregated 
{ 
    private readonly IAmFat fat; 

    public FatAdapter(IAmFat fat) 
    { 
     this.fat = fat; 
    } 

    void IAmSegregated.Method1() 
    { 
     this.fat.Method1(); 
    } 
} 
+2

+1 Никто не хочет, чтобы быть толстым (или сегрегация по этому вопросу) :( – jgauffin

+0

Так что мне нужно также класс, который реализует IAmFat, и какой экземпляр будет введен в FatAdapter конструктор? –

+0

Нет, если ваш жир класс не имеет интерфейса, вы просто вводите этот класс. И если у класса есть статические методы, вам вообще не нужно вводить его, вы можете просто вызвать один из них непосредственно из 'FatAdapter'. – Steven

0

Адаптер на самом деле не является подходящим инструментом здесь. Его цель состоит в том, чтобы сделать два несовместимых интерфейса способными говорить, адаптируя их друг к другу. В этом случае вы хотите, чтобы какой-то поднабор функциональности по-разному основывался на конечном пользователе. В этом случае вы хотите использовать facade.

class Fat{ 
    public string A(); 
    public int B(); 
    . 
    public void EatMeat() 
    . 
    public void Z(); 
} 
class JennyCraig{ 
    private Fat f = Fat(); 
    public string A(){ 
    return f.A(); 
    } 
    public void Z(){ 
    return f.Z(); 
    } 
class Atkins{ 
    public Fat f = Fat(); 

    public void EatMeat(){ 
     return f.EatMeat(); 
    } 
}