适配器模式浅谈

首先,我们来说一下什么是适配器:用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极、阴极外,还有一个地极。而有些地方的电源插座却只有两极,没有地极。电源插座与笔记本电脑的电源插头不匹配使得笔记本电脑无法使用。这时候一个三相到两相的转换器(适配器)就能解决此问题,而这正像是本模式所做的事情

那么,转换到代码中去我们可以理解为,使原本因接口不匹配而无法在一起工作的两个类能够在一起工作!也可以说是在不改变类原来的结构上添加新的方法!

比如,我有一个person类,这个person类有说,读两个方法,如今我需要在这个的基础上在增加写这个方法,这个”写“就是要加入的这个方法,但是就会有人会问,我们为什么不直接写一个子类,或者直接家加上一个方法呢?我的理解是,所谓的“适配”,就是再需要用的时候才用适配器,不用的时候就甩掉他,这就表现出了java编码低耦合的思想

当这个接口为了满足客户端需要,又要重新进行适配的时候,我们就可以写新的适配器,而不去影响原来类的接口

类适配:

person类:

public class Person {
	public void speak(){
		System.out.println("speak");
	}

	public void read(){
		System.out.println("read");
	}
}

接口

public interface Target {
	void speak();

	void read();

	void write();
}
public class NewPerson extends Person implements Target {

	@Override
	public void write() {
		//do something

	}

}

这个NewPerson就满足了新客户端的要求,这种叫做类适配器!这样就把write方法加入进去了,而不影响结构

对象适配

细心的朋友会发现,上一种方式有点缺陷,因为java只有单继承的关系,上面这种使用对象继承的方式,是静态的定义方式;而对象适配器使用对象组合的方式,是动态组合的方式

public class NewPerson_2 implements Target {

	Person person;

	public NewPerson_2(Person person) {
		this.person=person;
	}

	@Override
	public void speak() {
		this.person.speak();
	}

	@Override
	public void read() {
		this.person.read();
	}

	@Override
	public void write() {
		//do something
	}

}

对象适配没有用到继承,这样的好处就是能够把多个需要适配的对象都聚合在一起来适配,对象适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类都适配到目标接口。因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓。

如果在团队开发当中,每个人都实现自己要实现的方法,但是大家气其实上都是写的一个接口,通过对象适配的方法,就可以把多个人实现好了类都聚合在一起使用了,当然这是一个笑话,团队发开中还有更好的模式能够替代他!

这里还有一种默认的适配器模式

public interface Target {

	void function1();

	void function2();
}
public abstract class T implements Target {

	@Override
	public void function1() {}

	@Override
	public void function2() {
		// TODO Auto-generated method stub

	}
}
public class T1 extends T {

	@Override
	public void function1() {

	}

}

当一个接口中的东西不希望你全部都实现它的时候,可以用到这种抽象类!然后写一个子类继承他,写你需要写的方法!

WindowListener和windowAdapter就是一个例子,后者是一个抽象类,所以我们可以继承后者来完成我们的功能!

小结:

适配器模式使我们可以重用一个现有的类,以满足客户端的需要,当客户端通过接口表达其需求的时候,通常可以创建一个实现了该接口的新类,同时使该类继承自实现的现有类,这种方式既是类的适配器,他能够将客户端的调用转换为对现有类方法的调用。

当客户端没有指定它所需要的接口时,你就可以使用适配器模式。可能需要创建一个新的客户端子类,他将使用现有类的实例。这种方式通过创建一个对象适配器。将客户端的调用指向现有类的实例。如果我们不需要重写客户端可能调用的方法时,这种方式存在一定的危险性。

适配器模式浅谈

时间: 2024-10-04 13:00:37

适配器模式浅谈的相关文章

浅谈设计模式

米老师布置了作业,分析23种设计模式的异同,绞尽脑汁,冥思苦想还是认为初学设计模式,此问题过于高深实在不敢妄语.可是作业始终是要交的,只好浅谈一下设计模式,如理解有误,也算留下了一个底子,日后回头再看,这便是成长. 关于分类,设计模式分为三大类,分别为行为型,创建型,和状态型. 亦有几大原则,分别为:单一职责原则.开放-封闭原则.依赖导致原则.迪米特法则. 总体来说,不论什么模式,都是为了更好的发挥面向对象的思想,来加强类内部的内聚,来降低类与类之间的耦合,尽量做到"高内聚,低耦合",

浅谈设计原则和设计模式

文章结构: 1.前言 2.设计原则       3.设计模式 3.1 创建型模式 3.2 结构型模式 3.3 行为型模式 前言 设计原则和设计模式旨在帮助我们设计出一个可复用.可扩展.可维护的应用. 设计原则:设计OR重构系统的指导方针. 设计模式:解决某类问题性质有效的方法. 设计原则和设计模式要实现的目标是:在需求变动或者系统升级时,尽可能少的改变代码,尽可能多的实现新的功能. 设计原则是设计模式的"背后的故事",要深入理解设计模式必先深入理解设计原则. 设计原则 1.开闭原则(O

.net中对象序列化技术浅谈

.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数 据.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象.此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件 中“恢复”对象到序列化之前的状态.在.net中有提供了几种序列化的方式:二进制序列化

浅谈——页面静态化

现在互联网发展越来越迅速,对网站的性能要求越来越高,也就是如何应对高并发量.像12306需要应付上亿人同时来抢票,淘宝双十一--所以,如何提高网站的性能,是做网站都需要考虑的. 首先网站性能优化的方面有很多:1,使用缓存,最传统的一级二级缓存:2,将服务和数据库分开,使用不同的服务器,分工更加明确,效率更加高:3,分布式,提供多台服务器,利用反向代理服务器nginx进行反向代理,将请求分散开来:4,数据库的读写分离,不同的数据库,将读操作和写操作分开,并实时同步即可:5,分布式缓存,使用memc

单页应用SEO浅谈

单页应用SEO浅谈 前言 单页应用(Single Page Application)越来越受web开发者欢迎,单页应用的体验可以模拟原生应用,一次开发,多端兼容.单页应用并不是一个全新发明的技术,而是随着互联网的发展,满足用户体验的一种综合技术. SEO 一直以来,搜索引擎优化(SEO)是开发者容易忽略的部分.SEO是针对搜索(Google.百度.雅虎搜索等)在技术细节上的优化,例如语义.搜索关键词与内容相关性.收录量.搜索排名等.SEO也是同行.市场竞争常用的的营销手段.Google.百度的搜

浅谈html标签

浅谈html各常用标签用法 标题标签:<h1>-<h6>来表示,使标题字体变粗. <br />换行标记 <hr />水平分隔符 &nbsp空格符 &copy版权符 <a href>a标签超链接 href可接链接地址 <p>段落标签<blockquote>引用标签及可用做缩进 <table>表格中的<ul>无序列表<ol>有序列表<dl>自定义列表<row

浅谈二维中的树状数组与线段树

一般来说,树状数组可以实现的东西线段树均可胜任,实际应用中也是如此.但是在二维中,线段树的操作变得太过复杂,更新子矩阵时第一维的lazy标记更是麻烦到不行. 但是树状数组在某些询问中又无法胜任,如最值等不符合区间减法的询问.此时就需要根据线段树与树状数组的优缺点来选择了. 做一下基本操作的对比,如下图. 因为线段树为自上向下更新,从而可以使用lazy标记使得矩阵的更新变的高校起来,几个不足就是代码长,代码长和代码长. 对于将将矩阵内元素变为某个值,因为树状数组自下向上更新,且要满足区间加法等限制

[nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)

蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体温计.耳温枪.皮肤水分计等), 再到智能家居等领域均占有一席之地. 而蓝牙低功耗(BLE)是在蓝牙4.0协议上修改以适用低功耗应用场景的一种蓝牙协议. 随着上一股智能消费类电子大潮的到来,BLE的各种应用也像雨后春笋般在市场上铺开. 如果想 紧跟蓝牙协议的最新动态 ,可以在https://www.b

浅谈C++容器动态内存管理的优化

在信息学竞赛中,C++的容器的用途非常广泛,但经常因常数过大而超时.怎样才能提高它们的效率呢? 我们知道,容器是存储同一类对象的对象,既然"对象"我们无法改变,那么我们只能从"存储"入手,不难想到,不同容器在实现上的根本区别是它们对应着不同的内存组织方式,内存管理无疑是这种实现的核心,所以优化内存管理是加快容器效率的最好途径之一. 一.内存分配器简介 怎样才能优化内存管理呢?很简单,C++为我们提供了这样的接口,我们可以通过自定义容器模板中的最后一个allocato