设计模式(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!");
	}
	
}
相关推荐
BruceGerGer10 天前
flutter开发实战-flutter web加载html及HtmlElementView的使用
flutter·1024程序员节
网络冒险家2 个月前
【软考】系统集成项目管理工程师【第二版】
职场和发展·软考·集成学习·1024程序员节·系统集成项目工程师
BruceGerGer2 个月前
flutter开发实战-AssetBundle读取指定packagename的文件
flutter·1024程序员节
sheng12345678rui2 个月前
最新缺失msvcp140.dll的多种解决方法,有效解决电脑dll问题
windows·microsoft·电脑·dll文件·1024程序员节
a5553338202 个月前
电脑显示mfc140u.dll丢失的修复方法,总结7种有效的方法
java·经验分享·dll·dll文件丢失·1024程序员节
行十万里人生2 个月前
C++ 智能指针
linux·c++·git·阿里云·容器·蓝桥杯·1024程序员节
a5553338202 个月前
启动鸣潮提示错误代码126:加载d3dcompiler_43.dll错误或缺失的7个解决方法
前端·经验分享·dll·dll文件丢失·1024程序员节
BruceGerGer2 个月前
flutter开发实战-Webview及dispose关闭背景音
flutter·1024程序员节
BruceGerGer3 个月前
flutter开发实战-ListWheelScrollView与自定义TimePicker时间选择器
flutter·1024程序员节
askah66443 个月前
电脑提示msvcr120.dll丢失怎样修复
经验分享·microsoft·dll修复·dll丢失·1024程序员节