设计模式(13)适配器模式

一、介绍:

1、定义:是一种结构型设计模式,它可以将一个类的接口转换成客户端所期望的另一种接口。适配器模式常用于系统的不兼容性问题。

2、组成:

(1)目标接口(Target):客户端所期望的接口,适配器通过实现目标接口来对外提供服务。

(2)适配器(Adapter):将源接口转换成目标接口的类,它实现了目标接口,并且包含一个对源接口的引用。

(3)源接口(Adaptee):需要被适配的类,其接口与目标接口不兼容。

3、UML类图:

4、优缺点:

(1)优点:

更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。

更好的扩展性:在实现适配器功能的时候,可以扩展自己源的行为(增加方法),从而自然地扩展系统的功能。

完美实现解耦,通过增加适配器类将适配者与目标接口联系起来,无需修改原有实现;

符合开闭原则

(2)缺点:会导致系统紊乱:滥用适配器,会让系统变得非常零乱。例如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

5、适配器模式有2种:面向类的适配器模式,面向对象的适配器模式。常说的是对象适配器。

二、demo:

1、类适配器模式:

复制代码
//源:
 class Person {
        public void speakJapanese() {
            System.out.println("I can speak Japanese!");
        }

        public void speakEnglish() {
            System.out.println("I can speak English!");
        }
    }

//目标:
    interface Target {
        void speakJapanese();

        void speakEnglish();

        void speakFrench();
    }

//适配器:
    class Adapter extends Person implements Target {

        @Override
        public void speakFrench() {

        }
    }

2、对象适配器模式:把"源"作为一个对象聚合到适配器类中。

复制代码
  //源  
 class Person {
        public void speakJapanese() {
            System.out.println("I can speak Japanese!");
        }

        public void speakEnglish() {
            System.out.println("I can speak English!");
        }
    }


    //对象
    interface Target {
        void speakJapanese();

        void speakEnglish();

        void speakFrench();
    }

    //适配器
    class Adapter implements Target {

        Person mPerson;

        public Adapter(Person person) {
            this.mPerson = person;
        }

        @Override
        public void speakJapanese() {
			 mPerson.speakJapanese();
        }

        @Override
        public void speakEnglish() {
			 mPerson.speakEnglish();
        }

        @Override
        public void speakFrench() {

        }
    }

3、接口适配器模式(缺省适配模式):

这种模式的核心归结如下:当你想实现一个接口但又不想实现所有接口方法,只想去实现一部分方法时,就用默认的适配器模式,他的方法是在接口和具体实现类中添加一个抽象类,而用抽象类去空实现目标接口的所有方法。而具体的实现类只需要覆盖其需要完成的方法即可。

复制代码
public interface Job {
	
	public abstract void speakJapanese();
	public abstract void speakEnglish();
	public abstract void speakFrench();
	public abstract void speakChinese();
	
}

public abstract class JobDefault implements Job{

	public void speakChinese() {
		
	}

	public void speakEnglish() {
		
	}

	public void speakFrench() {
		
	}

	public void speakJapanese() {
		
	}

}

public class JobImpl extends JobDefault{
	
	public void speakChinese(){
		System.out.println("I can speak Chinese!");
	}
	
}
相关推荐
开开心心就好2 天前
卸载工具清理残留,检测垃圾颜色标识状态
linux·运维·服务器·python·安全·tornado·1024程序员节
子燕若水3 天前
Facebook reels 运营指南
1024程序员节
尘觉6 天前
创作 1024 天|把热爱写成长期主义
数据库·1024程序员节
写点什么呢7 天前
Word使用记录
word·1024程序员节
开开心心就好7 天前
内存清理工具点击清理,自动间隔自启
linux·运维·服务器·安全·硬件架构·材料工程·1024程序员节
开开心心就好8 天前
内存清理工具开源免费,自动优化清理项
linux·运维·服务器·python·django·pdf·1024程序员节
张萌杰11 天前
深度学习的基础知识(常见名词解释)
人工智能·深度学习·机器学习·1024程序员节
开开心心就好12 天前
免费无广告卸载工具,轻便安全适配全用户
linux·运维·服务器·网络·安全·启发式算法·1024程序员节
开开心心就好13 天前
图片格式转换工具,右键菜单一键转换简化
linux·运维·服务器·python·django·pdf·1024程序员节
徐子童15 天前
网络协议---TCP协议
网络·网络协议·tcp/ip·面试题·1024程序员节