MongoDB索引
一、作用
适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
二、适用场景
1. 业务的接口与工作的类不兼容,(比如:类中缺少实现接口的某些方法)但又需要两者一起工作
2. 在现有接口和类的基础上为新的业务需求提供接口
三、常见的使用方式
还是以Usb接口和Phone手机类的产品举例子,假设设计的Phone类中有 call(), sms(), takeAlong()属性方法,而在设计Usb接口时定义了 store(), takeAlong()的行为。如果现在有新的业务需求,需要生成 Xiaomi手机类具有 Phone类和Usb接口两者功能,假设Phone类和Usb接口已经在业务上投入使用,很显然,去修改原类中的方法和接口的行为去满足现在的新业务需求是不可取的,那么现在适配者模式就派上用场了。
(1)类适配模式
大致的意思是新的业务类Xiaomi通过继承旧业务的类Phone并实现接口Usb来满足新的业务的一种适配方式,如下图

Usb接口
public interface Usb {
void store();
void takeAlong();
}
Phone类
public class Phone {
public void call() {
System.out.println("Phone call");
}
public void sms() {
System.out.println("Phone sms");
}
public void takeAlong() {
System.out.println("Phone takeAlong");
}
}
适配 Xiaomi 类
/**
* 类的适配器模式
* phone + Usb
* 将Phone的功能扩展到Usb里 */
public class Xiaomi extends Phone implements Usb { @Override
public void store() {
// TODO Auto-generated method stub
System.out.println("store implements usb");
} }
适配完后使用
Xiaomi mi1 = new Xiaomi();
mi1.takeAlong();
mi1.store();
输出:
Phone takeAlong
store implements usb
这样新的业务需求就可以通过适配的 Xiaomi类去满足了。是不是觉得很简单呢!!:) 有没有其他的方式去实现同样的功能呢?当然有,就是下面要讲的对象适配模式。
(2)对象适配模式
实现的方式很简单,其实就是在适配的时候通过构造函数将旧的业务Phone 当作新的适配类(XiaomiWrapper)一个成员对象去处理,然后适配类只需要实现接口 Usb即可。如下类关系图

适配类XiaomiWrapper如下,注意takeAlong()方法,是直接调用原类对象(Phone)去执行的。
public class XiaomiWrapper implements Usb {
/**
* 1.创建一个Wrapper类,持有原类的一个实例,
* 2.在Wrapper类的方法中,调用实例的方法就行
*/
private Phone phone;
public XiaomiWrapper(Phone phone) {
this.phone = phone;
}
@Override
public void store() {
// TODO Auto-generated method stub
System.out.println("store implements usb");
}
@Override
public void takeAlong() {
// TODO Auto-generated method stub
phone.takeAlong();
}
}
适配完后通过构造函数将原对象传入即可。
XiaomiWrapper mi2 = new XiaomiWrapper(new Phone());
mi2.takeAlong();
mi2.store();
输出:
Phone takeAlong
store implements usb
或许到这里,你会觉得这种方式很简单吧。但是如果出现这个Usb接口中有很多方法(大于2个),但是新的业务需求中也只需要其中的一两个,而且是需要适配很多这样的业务,这样的话,用上面的方法每次适配一次就会去实现所有Usb接口中的方法,实际上适配的类中有很多是用不到的,没有必要把接口中不使用的类也适配进去,这时候,就轮到下面的接口适配模式出场了。
(3)接口适配模式
适配新的业务需求的时候借助抽象实现类(AbsPhone实现Usb接口),也就说,抽象实现类把Usb接口中的行为都实现了,新的适配是需要跟抽象类对话就行,因为抽象实现类就能满足了所有适配的需求,并且做到了只适配业务本身的行为,接口中不需要的行为我根本不需要关注。这就是抽象实现类的作用。类图关系如下:

抽象类AbsPhone实现
/**
* 接口的适配器模式
* 1.借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法
* 2.继承类可以选择性的实现接口中的方法
*/
public abstract class AbsPhone implements Usb { public void store() {
System.out.println("AbsPhone implements usb's store methond");
} public void takeAlong() {
System.out.println("AbsPhone implements usb's takeAlong methond");
}
}
适配类只跟AbsPhone打交道,根本不需要关心接口的行为,只显示自己所要关注的。
如Phone1适配只需要store()行为
public class Phone1 extends AbsPhone {
public void call() {
System.out.println("Phone1 call");
}
public void sms() {
System.out.println("Phone1 sms");
}
public void store() {
System.out.println("Phone1 need usb's store methond");
}
}
Phone2适配只需要takeAlong()行为
public class Phone2 extends AbsPhone {
public void call() {
System.out.println("Phone2 call");
}
public void sms() {
System.out.println("Phone2 sms");
}
public void takeAlong() {
System.out.println("Phone2 need usb's takeAlong methond");
}
}
实例化调用
Phone1 p1 = new Phone1();
Phone2 p2 = new Phone2();
p1.store();
p2.takeAlong();
输出:
Phone1 need usb's store methond
Phone2 need usb's takeAlong methond
来一次完整的调用
Phone1 p1 = new Phone1();
Phone2 p2 = new Phone2();
p1.store();
p1.takeAlong();
p2.takeAlong();
p2.store();
输出:
Phone1 need usb's store methond
AbsPhone implements usb's takeAlong methond
Phone2 need usb's takeAlong methond
AbsPhone implements usb's store methond
这样很清晰的知道适配的什么方法了。
总结:适配者模式在android源码中有很多这样的体现,大家看完这个再去看源码,是不是会感觉看懂了不少呢?
MongoDB索引的更多相关文章
- [DataBase] MongoDB (7) MongoDB 索引
MongoDB 索引 1. 建立索引 唯一索引db.passport.ensureIndex( {"loginname": 1}, {"unique": tru ...
- MongoDB索引介绍
MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...
- MongoDB(索引及C#如何操作MongoDB)(转载)
MongoDB(索引及C如何操作MongoDB) 索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureInd ...
- MongoDB索引(一)
原文地址 一.介绍 我们已经很清楚索引会提高查询效率.如果没有索引,MongoDB必须对全部集合进行扫描,即,扫描集合中每条文档以选择那些符合查询条件的文档.对查询来说如果存在合适的索引,则Mongo ...
- MongoDB 索引篇
MongoDB 索引篇 索引的简介 索引可以加快查询的速度,但是过多的索引或者规范不好的索引也会影响到查询的速度.且添加索引之后的对文档的删除,修改会比以前速度慢.因为在进行修改的时候会对索引进行更新 ...
- MongoDB索引的种类与使用
一:索引的种类 1:_id索引:是绝大多数集合默认建立的索引,对于每个插入的数据,MongoDB都会自动生成一条唯一的_id字段2:单键索引: 1.单键索引是最普通的索引 2.与_id索引不同,单键索 ...
- MongoDB索引,性能分析
索引的限制: 索引名称不能超过128个字符 每个集合不能超过64个索引 复合索引不能超过31列 MongoDB 索引语法 db.collection.createIndex({ <field&g ...
- MongoDB索引原理
转自:http://www.mongoing.com/archives/2797 为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下M ...
- MongoDB · 引擎特性 · MongoDB索引原理
MongoDB · 引擎特性 · MongoDB索引原理数据库内核月报原文链接 http://mysql.taobao.org/monthly/2018/09/06/ 为什么需要索引?当你抱怨Mong ...
- MongoDB索引管理
一.创建索引 创建索引使用db.collectionName.ensureIndex(...)方法进行创建: 语法: >db.COLLECTION_NAME.ensureIndex({KEY:1 ...
随机推荐
- 《Entity Framework 6 Recipes》中文翻译系列 (44) ------ 第八章 POCO之POCO中使用值对象和对象变更通知
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-4 POCO中使用值对象(Complex Type--也叫复合类型)属性 问题 ...
- Intellij IDEA 13.1.3 字体,颜色,风格设置
作者QQ:1095737364 打开file-->settings,然后根据提示完成设置,当然,可以根据自己的爱好设置自己的风格,那个工程区的背景我还没有找到在什么地方,如果你找到了麻烦告诉我一 ...
- EF优缺点的理解
原先用的是三层架构中ADO.NET做底层开发,纯手工sql语句拼装.后来遇到一个MVC+EF项目,体会到了EF的强大性. 它是微软封装好一种ADO.NET数据实体模型,将数据库结构以ORM模式映射到应 ...
- 《C#高级编程》学习总结之LINQ
一.标准的查询操作符 标准查询操作符 说明 Where OfType<TResult> 筛选操作符定义了返回元素的条件. Select SelectMany 投射操作符用于把对象转换为另一 ...
- EF Power Tools参数不正确的解决方法
在Visual Studio 2010安装了EF Power Tools Beta 3之后,希望根据本地现有数据库模型来生成基于Entity Framework Code First的代码时,经常出现 ...
- IOS入门之Swift语言(一)
经过不断的努力,小哥也买了台苹果设备,终于可以开始我的IOS之旅了,说来确实令人苦恼,为了学习IOS我这着贫农阶级,省了几个月的零花钱,外加向亲朋好友求救,最终痛下心扉,卖了台MAC pro128G版 ...
- Android开发之Toast
第一次在博客园发布文章,就把我刚弄明白的关于Android开发中的提示设置,分享给大家. Toast是Android中经常用到的一个方法,用于简单的用户提示,经过摸索我发现了Toast的两种使用方式, ...
- php的基础
js是前段脚本语言 php是后端脚本语言 一.所建的文件都要存在wap下的www里面 二.所有的文件名都不能包含中文 三.通过输入 localhost/www下的文件名称,可以浏览 四.在DW内新建站 ...
- .NET平台开源项目速览(10)FluentValidation验证组件深入使用(二)
在上一篇文章:.NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(一) 中,给大家初步介绍了一下FluentValidation验证组件的使用情况.文章从构建间的验证器开 ...
- 比较一下以“反射”和“表达式”执行方法的性能差异
由于频繁地使用反射会影响性能,所以ASP.NET MVC采用了表达式树的方式来执行目标Action方法.具体来说,ASP.NET MVC会构建一个表达式来体现针对目标Action方法的执行,并且将该表 ...