2011-03-29 147 views
25

我有几个关于适配器模式的问题。我知道类适配器从适配器继承而对象适配器具有作为对象的适配器而不是继承它。适配器模式:类适配器与对象适配器

什么时候可以通过对象适配器使用类适配器,反之亦然?另外,使用类适配器和对象适配器的权衡有什么权衡?

回答

22

根据您的编程语言,我可以看到对象适配器的一个优点:如果后者不支持多继承(例如Java),并且想要一次调整几个适配器,我们有义务使用对象适配器。

对象适配器的另一点是,您可以让包装的适配器按照需要生活(实例化显着,只要您在适配器之后实例化适配器),而不必指定所有参数(适配器的部件以及由于继承而适合您的适配器的部分),当您实例化适配器时。这种方法对我来说更加灵活。

12

倾向于使用构图,通过继承

首先说我们有一个用户;

public interface IUser 
{ 
    public String Name { get; } 
    public String Surname { get; } 
} 

public class User : IUser 
{ 
    public User(String name, String surname) 
    { 
     this.Name = name; 
     this.Surname = surname; 
    } 

    public String Name { get; private set; } 
    public String Surname { get; private set; } 
} 

现在,假设以任何理由,你就是有用户类的适配器,我们有那么双aproaches,通过继承,或复合要求;

//Inheritance 
public class UserAdapter1 : User 
{ 
    public String CompleteName { get { return base.Name + " " + base.Surname } } 
} 

//Composition 
public class UserAdapter2 
{ 
    private IUser user; 

    public UserAdapter2(IUser user) 
    { 
     this.user = user; 
    } 

    public String CompleteName { get { return this.user.Name + " " + this.user.Surname; } } 
} 

你是完全OK,只是如果系统不长......想象一下,实现超级用户级,为了应对新的要求,需要您选择;

public class SuperUser : IUser 
{ 
    public SuperUser(String name, String surname) 
    { 
     this.Name = name; 
     this.Surname = surname; 
    } 

    public String Name { get; private set; } 
    public String Surname { get; private set; } 

    public Int32 SupernessLevel { get { return this.Name.Length * 100; } } 
} 

通过继承,你将无法再使用您的适配器类,搞乱你的代码(如你将不得不实现另一个适配器,超级用户继承,会做ECXATLY其他的同样的事情类!!!)...接口的使用是关于uncopling,这是我有99%的可能使用它们的主要原因,当然,如果选择取决于我。

0
  • 类适配器适应适配者通过承诺特定的适配器类时,我们要适应及其子类将无法正常工作的目标。
  • 对象适配器让许多Adaptees(该适配者和所有adaptees层次)的单个适配器工作
4

类适配器使用多重继承到一个接口适应另:(取决于你的编程语言:Java的& C#不支持多继承) enter image description here

对象适配器取决于对象组成: enter image description here

图片来源:设计模式(可复用面向对象软件的元素)一书

0

除了what renatoargh has mentioned in his answer我想补充类适配器的优势。

在类适配器,你可以很容易地,如果你需要,因为你只是继承它覆盖适配者的行为。对象适配器更难。

然而,对象适配器的优点通常超过了类适配器的这一小优点。