0
点赞
收藏
分享

微信扫一扫

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

WikongGuan 2022-01-13 阅读 26

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的转变
    }
    
举报

相关推荐

0 条评论