首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >适配器模式:类适配器与对象适配器

适配器模式:类适配器与对象适配器
EN

Stack Overflow用户
提问于 2011-03-29 09:41:21
回答 6查看 16K关注 0票数 35

我有几个关于Adapter模式的问题。我知道类适配器继承自被适配器者,而对象适配器将被适配器者作为对象而不是从其继承。

什么时候会使用类适配器而不是对象适配器,反之亦然?另外,使用类适配器和对象适配器的权衡是什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-03-29 18:51:18

我可以看到对象适配器的一个优点,这取决于您的编程语言:如果后者不支持多重继承(例如Java ),而您希望一次适应多个适配器,那么您将不得不使用对象适配器。

对象适配器的另一个要点是,当您实例化适配器时,不必指定所有参数(适配器的部分和被适配器的部分,因为继承),您可以让包装的适配器随心所欲地生活(值得注意的是,实例化,只要您在适配器之后实例化适配器)。对我来说,这种方法似乎更灵活。

票数 25
EN

Stack Overflow用户

发布于 2011-03-29 18:36:12

Class Adapter是普通的老式Inheritance,可在所有面向对象语言中使用,而Object AdapterAdapter Design Pattern的经典形式。

Class Adapter (以及Inheritance )相比,Object Adapter最大的好处是客户端和适配器的loose coupling

票数 14
EN

Stack Overflow用户

发布于 2011-03-30 00:24:52

更喜欢使用组合,而不是继承

首先,假设我们有一个用户;

代码语言:javascript
复制
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; }
}

现在,想象一下,不管出于什么原因,你需要有一个user类的适配器,然后我们有两个方法,通过继承,或者通过组合;

代码语言:javascript
复制
//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; } }
}

你完全没问题,但如果系统不增长的话...假设你需要实现一个SuperUser类,以处理一个新的需求;

代码语言:javascript
复制
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; } }
}

通过使用继承,您将无法重用您的适配器类,从而弄乱您的代码(因为您将不得不实现另一个适配器,从SuperUser继承,它将执行与另一个类相同的事情!)接口使用都是关于解开的,这是我99%可能使用它们的主要原因,当然,如果由我来选择的话。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5467005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档