2016-12-11 2 views
0

Je veux savoir si j'ai une classe de façade, puis-je créer une interface et avoir plusieurs implémentations de la classe.Puis-je avoir une interface dans un motif de conception de façade?

Par exemple:

interface IUserDetailFacade{} 

public class UserDetailsFacade implements IUserDetailFacade{} 

public class UserDetailsLdapFacade implements IUserDetailFacade{} 
+0

Pas grand chose à faire ici, pouvez-vous donner un exemple de votre intention. Le but du modèle de Façade est d'abstraire la complexité de plusieurs systèmes connexes de hiérarchie de classe. Donc, je peux manquer d'interpréter votre question; cependant, alors que la façade est bien sûr une abstraction en soi, elle est ironiquement adaptée aux sous-systèmes spécifiques que vous essayez de détruire. À cet égard, votre question n'a pas de sens, car c'est comme demander: «Si j'ai une solution à un problème, puis-je avoir une autre solution au même problème en utilisant la même solution». La logique circulaire est à vous, je ne fais que le signaler. –

Répondre

1

Bien sûr, vous pouvez.

L'exemple que vous avez partagé n'est pas assez détaillé pour moi de comprendre comment une couche supplémentaire d'abstraction (le interface vous voulez créer) s'intègre.

Mais laissez-moi vous donner un exemple où cela aurait avoir un sens.

Exemple

Supposons que vous créez une application qui teste comment compilateurs efficacement différents C++ compilez le même code source.

Vous pouvez créer CppCompiler en tant que interface sur différentes façades, une pour chaque type de CppCompiler.

public interface CppCompiler { 
    void compile(String sourceFile); 
} 

TurboCppCompiler, BorlandCppCompiler, GccCppCompiler, etc. sont façades d'un sous-système de classes qui font différentes étapes dans la compilation comme l'analyse syntaxique, l'assemblage, la liaison, etc. Par exemple, la mise en œuvre TurboCppCompiler ressemblerait à quelque chose comme ça .

public class TurboCppCompiler implements CppCompiler { 

    // .. private variables 

    public TurboCppCompiler(TurboParser parser, TurboAssembler assembler, TurboLinker linker) { 
     this.parser = parser; 
     this.assembler = assembler; 
     this.linker = linker; 
    } 

    public void compile(String sourceFile) { 
     /* Compile the code Borland Cpp style using the subsystems Parser, Assembler, Linker */ 
    } 
} 

Utilisation

Vous pouvez créer une méthode de fabrication qui obtient un compilateur (remarquez comment le CppCompiler est utilisé comme un type return ici)

public static CppCompiler createCppCompiler(CompilerType type) { 
    switch (type) { 
     case TURBO: 
      return new TurboCppCompiler(new TurboParser(), new TurboAssembler(), new TurboLinker()); 
     case BORLAND: 
      return new BorlandCppCompiler(new BorlandParser(), new BorlandAssembler(), new BorlandLinker()); 
     case GCC: 
      return new GccCppCompiler(new GccParser(), new GccAssembler(), new GccLinker()); 
    } 
    throw new AssertionError("unknown compiler type:" + type); 
} 

Hope this helps.

1

Vous êtes dans la bonne voie, parce que d'autres parties de votre système seront couplés avec des abstractions (votre interface de façade) pendant que vous pouvez garantir que votre système fonctionnera avec de multiples données implémentations de toute l'interface de façade.