适配器模式

数字云翼客
• 阅读 1241

1. 适配器模式

将一个类的接口转化成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

A: 东西在眼前,却短时间不能使用,例如语言不通,电压。
A: 在软件开放过程中,系统的数据和行为都正确,但接口不符时,我们应该考虑适配器,目的是控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口由于复用环境要求不一致的情况。
适配器模式

class Program
{
    static void Main(string[] args)
    {
        Target target = new Adapter();
        target.Request();

        Console.Read();

    }
}

class Target
{
    public virtual void Request()
    {
        Console.WriteLine("普通请求");
    }
}

class Adaptee
{
    public void SpecificRequest()
    {
        Console.WriteLine("特殊请求");
    }
}

class Adapter : Target
{
    private Adaptee adaptee = new Adaptee();

    public override void Request()
    {
        adaptee.SpecificRequest();
    }
}

2. 何时使用适配器模式

B: 想使用一个以及存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式?
A: 两个类所做的事情相同或相似,但是具有不同的接口时要使用它。
B: 客户代码可以统一调用同一接口,这样可以更简单,更直接,更紧凑。
A: 首先,公司内部,类和方法的命名应该有规范,最好前期就设计好,然后如果真的如你所说,接口不相同时,首先不应该考虑用适配器,而是应该考虑通过重构统一接口。
B: 就是要在双方都不太容易修改的时候在使用适配器模式适配,而不是一有不同就使用。
A: 完全没有必要为了迎合第三方而改动自己的接口。

3. 篮球翻译适配器

class Program
{
    static void Main(string[] args)
    {
        Player b = new Forwards("巴蒂尔");
        b.Attack();

        Player m = new Guards("麦克格雷迪");
        m.Attack();

        //Player ym = new Center("姚明");
        Player ym = new Translator("姚明");
        ym.Attack();
        ym.Defense();

        Console.Read();
    }
}

//篮球运动员
abstract class Player
{
    protected string name;
    public Player(string name)
    {
        this.name = name;
    }

    public abstract void Attack();
    public abstract void Defense();
}

//前锋
class Forwards : Player
{
    public Forwards(string name)
        : base(name)
    {
    }

    public override void Attack()
    {
        Console.WriteLine("前锋 {0} 进攻", name);
    }

    public override void Defense()
    {
        Console.WriteLine("前锋 {0} 防守", name);
    }
}

//中锋
class Center : Player
{
    public Center(string name)
        : base(name)
    {
    }

    public override void Attack()
    {
        Console.WriteLine("中锋 {0} 进攻", name);
    }

    public override void Defense()
    {
        Console.WriteLine("中锋 {0} 防守", name);
    }
}

//后卫
class Guards : Player
{
    public Guards(string name)
        : base(name)
    {
    }

    public override void Attack()
    {
        Console.WriteLine("后卫 {0} 进攻", name);
    }

    public override void Defense()
    {
        Console.WriteLine("后卫 {0} 防守", name);
    }
}

//外籍中锋
class ForeignCenter
{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public void 进攻()
    {
        Console.WriteLine("外籍中锋 {0} 进攻", name);
    }

    public void 防守()
    {
        Console.WriteLine("外籍中锋 {0} 防守", name);
    }
}

//翻译者
class Translator : Player
{
    private ForeignCenter wjzf = new ForeignCenter();

    public Translator(string name)
        : base(name)
    {
        wjzf.Name = name;
    }

    public override void Attack()
    {
        wjzf.进攻();
    }

    public override void Defense()
    {
        wjzf.防守();
    }
}

4. 扁鹊的医术

B: 如果能事先预防接口不同的问题,不匹配问题就不会发生;在有小的接口不统一问题发生时,及时重构,问题不至于扩大;只有碰到无法改变原有设计和代码的情况下,才考虑适配。事后控制不如事中控制,事中控制不如事前控制。
A: 适配器模式固然是好模式,但是如果无视对它的应用场合而盲目使用,其实是本末倒置。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java模式之一
代理模式的概念:对其他对象提供一种代理以控制对这个对象的访问代理模式的三种实现(1)静态代理静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.eg publicinterfacePammerDao{   voiddomain();}publicTargetimpl
系统认知篇:防腐层、门面模式及适配模式的本质 | 京东云技术团队
门面模式和适配器模式是代码级的设计模式,而防腐层本质是一种防御型策略,在更高的层级对系统进行解耦
zdd小小菜鸟 zdd小小菜鸟
2年前
设计模式面试
设计模式面试1.单例设计模式使用设计模式为了代码复用,增加可维护性。设计模式的六大原则:开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、迪米特法则(最少知道原则)、合成/聚合复用原则Singleton(创建):保证一个类仅
Easter79 Easter79
3年前
spring中策略模式使用
策略模式工作中经常使用到策略模式工厂模式,实现一个接口多种实现的灵活调用与后续代码的扩展性。在spring中使用策略模式更为简单,所有的bean均为spring容器管理,只需获取该接口的所有实现类即可。下面以事件处理功能为例,接收到事件之后,根据事件类型调用不同的实现接口去处理。如需新增事件,只需扩展实现类即可,无需改动之前的代码。这样即
Wesley13 Wesley13
3年前
7、【C++ STL】适配器
1、基本概念适配器,在STL中扮演着转换器的角色,本质上是一种设计模式,用于将一种接口转换成另一种接口,从而是原本不兼容的接口能够很好地一起运作。适配器不提供迭代器。2、基本类型根据目标接口的类型,适配器可分为以下几类:(1)改变容器的接口,称为容器适配器;(2)改变迭代器的接口,称为迭代器适配器;
Wesley13 Wesley13
3年前
Java设计模式(一)
Structuralpatterns结构型模式1.适配器模式(Adaptor)目的:将某个类/接口转换为client期望的其他形式。适配器让类可以协同工作,否则就会因为不兼容的接口而无法工作。通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体子类。假设我们有一个MediaPlayer接口和一个实现了
Wesley13 Wesley13
3年前
4种常见的 PHP 设计模式
工厂模式在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。_工厂模式_ 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 
Wesley13 Wesley13
3年前
Java 设计模式系列(十二)策略模式(Strategy)
Java设计模式系列(十二)策略模式(Strategy)策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。一、策略模式的结构策略模式是对算
Wesley13 Wesley13
3年前
JavaWeb之动态代理解决request请求编码问题
动态代理解决编码问题1.设计模式出现原因:软件开发过程中,遇到相似问题,将问题的解决方法抽取模型(套路)常见设计模式:单例,工厂,适配器,装饰者,动态代理。2.装饰者模式简单介绍谷歌汽车开发场景1.Java定义了汽车开发约定interfaceICar{s
Wesley13 Wesley13
3年前
Java适配器设计模式 的优缺点
1\.定义:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。2\.适配器模式的本质转换匹配,复用功能。3\.优点:更好的复用如果功能是已经有了的,只是接口不兼容,那么通过适配器模式就可以让这些功能得到更好的复用。更好的可扩展在实现适配器功能的时候,可以调用自己
Wesley13 Wesley13
3年前
Java中的设计模式
注:基于《Java高并发编程详解汪文君》、《深入理解JVM高级特性与最佳实践周志明》,以学习为目的,加上自身理解、验证。作为笔记,为加深印象,做到不复制,不粘贴。欢迎,大家一起交流学习。适配器模式如果当前类的接口不适用与客户端,那么把它转换为客户端所能接受的另一种接口就是适配器模式。从而使得两个接口不匹配而无法在一起工作的两个类能够在一起
数字云翼客
数字云翼客
Lv1
少而不学,老而无识。少壮不努力,老大徒伤悲。
文章
5
粉丝
0
获赞
0