一.结构型——适配器模式

适配器模式用于在接口不兼容时,使原有对象能够与期望接口匹配。文章介绍了类适配器和对象适配器的区别,类适配器无法为Adaptee子类提供适配且能重定义操作,而对象适配器则相反。适配器主要应用于数据和行为正确但接口不符的情况。文中以姚明在NBA打球需要翻译为例,阐述了适配器的应用场景,并给出了对象适配器的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.DP

  • 类适配器和对象适配器的比较

    类适配器:
    无法用这个具体的Adapter类为Adaptee的子类提供适配。
    Adapter可以重定义继承自Adaptee中的操作。

    对象适配器:
    ​ 一个Adapter类就可以为Adaptee及其子类提供适配。
    ​ 不能重定义Adaptee中的操作。

1.问题

问题:姚明在NBA技术交流没问题,但是语言沟通需要翻译–翻译即为适配器。
  在软件开发中,也就是系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口 又与复用环境要求不一致的情况

2.定义

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

  • 两种适配器类型:类适配器模式(通过多重继承,让两个接口进行匹配,许多语言如C# java都不支持)和对象适配器模式

3.结构图和代码

类适配器:

在这里插入图片描述

对象适配器:【以此为主】

在这里插入图片描述

代码

//Target:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
class Target
{
	public virtual void Request()
	{
		Console.WriteLine("普通请求!")}
}
//Adaptee:需要适配的类
class Adaptee
{
    public static void SpecialReqest()
    {
        Console.WriteLine("特殊请求!")
    }
}
//Adapter(通过在内部包装一个Adaptee对象,把源接口转换成目标接口)
class  Adapter extends Target
{
    private Adaptee adaptee =new Adaptee();//建立一个私有的被适配类
    
    @override 
    public static void Request()
    {
        adaptee.SpecificRequest();//这样就可以把表面上调用Request()方法变成实际调用SpecificRequest()
    }
}
//客户端代码
static void Main(String[] args[])
{
    Target tatget=new Adapter();
    target.Request();
    
    Console.Read();
}
  • 使用的场景:

    1. 要在双方都不太容易修改的时候再使用适配器模式适配,而不是一有不同时就使用它。有不同首先应该考虑统一接口。

    2. 但也有在开发的设计阶段,就考虑用适配器模式来解决接口不同的问题。比如公司设计一系统时考虑使用第三方开发组件,而这个组件的接口与我们自己的系统接口是不相同的,而我们也完全没有必要为了迎合它而改动自己的接口。

  • 应用举例
    在姚明打球的问题中,前锋、中锋、后卫都继承球员这个抽象类,实现Attack和Defense方法,姚明也有这两个方法,但听不懂这是什么,所以需要翻译者引用外籍中锋(在代码中,引种即为声明一个private的类型变量)

    在这里插入图片描述

    代码:

    //球员
    abstract class Player
    {
       protected String name;
        public Player(String name)
        {
            this.name=name;
        }
        public abstract void Attack();
        public abstract void Defense();
        
    }
    
    //外籍中锋
    class ForeignCenter
    {
    	private String name;
        public String Name;
        {
        	public void get()
        	{
        		return name;
        	}
        	public void set(String name)
        	{
        		this.name=name;
        	}
        }
        public abstract void 进攻()
        {
        	Console.WriteLIne("外籍中锋{0}进攻,name");
        }
        public abstract void Defense()
        {
        	Console.WriteLIne("外籍中锋{0}防守,name");
        }
        
    }
    
    //翻译者,继承Player
    class Translator implements Player
    {
       private ForeignCenter wgr=new ForeignCenter();
       @overrid
       public Translator(String name)
        {
            wgr.Name=name;
        }
        public abstract void Attack()
        {
            wgr.进攻();
        }
        public abstract void Defense()
        {
            wgr.防守();
        }
        
    }
    
    //客户端
    static void main(String[] args[])
    {
        Player p=new Translator("姚明");
        p.Attack();
        p.Defense();//实现了从进攻、防守到Attack、Defense的转变
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值