适配器模式,将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。

在以下情况下可以考虑使用适配器模式:

  1. 系统需要复用现有类,而该类的接口不符合系统的需求
  2. 想要建立一个可重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
  3. 对于对象适配器模式,在设计里需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。

C#适配器模式:

namespace 适配器模式
{
class Program
{
static void Main(string[] args)
{
Player b = new Forwards("巴蒂尔");
b.Attack(); Player m = new Guards("麦克格雷迪");
m.Attack(); //Player ym = new Center("姚明");
Player ym = new Translator("姚明");
ym.Attack();
ym.Defense(); Console.Read();
}
} //篮球运动员
abstract class Player
{
protected string name;
public Player(string name)
{
this.name = name;
} public abstract void Attack();
public abstract void Defense();
} //前锋
class Forwards : Player
{
public Forwards(string name)
: base(name)
{
} public override void Attack()
{
Console.WriteLine("前锋 {0} 进攻", name);
} public override void Defense()
{
Console.WriteLine("前锋 {0} 防守", name);
}
} //中锋
class Center : Player
{
public Center(string name)
: base(name)
{
} public override void Attack()
{
Console.WriteLine("中锋 {0} 进攻", name);
} public override void Defense()
{
Console.WriteLine("中锋 {0} 防守", name);
}
} //后卫
class Guards : Player
{
public Guards(string name)
: base(name)
{
} public override void Attack()
{
Console.WriteLine("后卫 {0} 进攻", name);
} public override void Defense()
{
Console.WriteLine("后卫 {0} 防守", name);
}
} //外籍中锋
class ForeignCenter
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
} public void 进攻()
{
Console.WriteLine("外籍中锋 {0} 进攻", name);
} public void 防守()
{
Console.WriteLine("外籍中锋 {0} 防守", name);
}
} //翻译者
class Translator : Player
{
private ForeignCenter wjzf = new ForeignCenter(); public Translator(string name)
: base(name)
{
wjzf.Name = name;
} public override void Attack()
{
wjzf.进攻();
} public override void Defense()
{
wjzf.防守();
}
}
}

js语言特性的适配器模式:

var googleMap = {
show:function(){
console.log('开始渲染谷歌地图');
}
}; var baiduMap = {
display:function(){
console.log('开始渲染百度地图');
}
}; var baiduMapAdapter = {
show:function(){
return baiduMap.display();
}
}; var renderMap = function(map){
if(map.show instanceof Function){
map.show();
}
}; renderMap(googleMap); //输出:开始渲染谷歌地图
renderMap(baiduMapAdapter); //输出:开始渲染百度地图

小结:

  1. 适配器模式主要用来解决两个已有接口之间不匹配的问题,它不考虑这些接口是怎样实现的,也不考虑它们将来可能会如何演化。适配器模式不需要改变已有的接口,就能够使它们协同作用。
  2. 装饰者模式和代理模式也不会改变原有的对象的接口,但装饰者模式的作用是为了给对象增加功能。装饰者模式常常形成一条长的装饰链,而适配器模式通常只包装一次。代理模式是为了控制对对象的访问,通常也只包装一次。
  3. 外观模式的作用倒是和适配器比较相似,有人把外观模式看成一组对象的适配器,但外观模式最显著的特点是定义了一个新的接口。

js适配器模式的更多相关文章

  1. JS常用的设计模式(4)——适配器模式

    去年年前当时正在开发dev.qplus.com, 有个存储应用分类id的js文件, 分类id的结构最开始设计的比较笨重. 于是我决定重构它. 我把它定义成一个json树的形式, 大概是这样: var ...

  2. 《JS设计模式笔记》 5,适配器模式

    //适配器模式的作用就像一个转接口. jQuery("#"+id); $id=function (id) { return jQuery("#"+id)[0]; ...

  3. js设计模式(6)---适配器模式

    0.前言 脖子又开始痛了,难道还没成为码农就开始出现颈椎问题,一直以来举得自己不算那种死宅的人,怎么这么年轻就出现这种问题.哎,不管了,还是先把自己学习的适配器模式写出来,算是一种总结吧. 1.为什么 ...

  4. JS设计模式(14)适配器模式

    什么是适配器模式? 定义:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 主要解决:主要解决在软件系统中,常常要将一些"现存 ...

  5. JS设计模式——11.适配器模式

    适配器模式概述 适配器模式可用来在现有接口和不兼容的类之间进行适配.使用这种模式的对象又叫包装器(wrapper). 适配器特点 从表面看,适配器模式很像门面模式.她们都要对别的对象进行包装并改变其呈 ...

  6. js设计模式-适配器模式

    说明:适配器模式表面上看起来像门面模式.它们都要对别的对象进行包装并改变其呈现的接口.但是两者的差别在于它们如何改变接口.门面元素展现的是一个简化的接口,它并不提供额外的选择,而且有时为了方便完成常见 ...

  7. js原生设计模式——10适配器模式之参数适配器

    原理:参数适配器说白了就是给出要带入数据字段的对应字段的默认值,一旦数据字段值不足,就取默认值补足. [写法一]:直接返回 <!DOCTYPE html><html lang=&qu ...

  8. 我对Backbone.js的一些认识

    backbone.js已经不是当前最流行的前端框架了,但是对于我而言,依然具有比较好的学习价值.虽然目前来说,react,vue等mvvm框架非常火热,但是感觉自身还不到去使用这种框架的层次.这些技术 ...

  9. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

随机推荐

  1. 使用mybatis向oracle数据库插入数据异常

    遇到了使用mybatis向oracle数据库插入数据异常的问题, 具体的报错如下:org.springframework.jdbc.UncategorizedSQLException: ### Err ...

  2. shell一则-按文件每行长度排序

    按文件每行长度排序  awk -F: '{print length($0) " "  $0}' /etc/shadow | sort -r -n | awk '{print $2} ...

  3. HTML 之 Table 表格详解

    HTML 之 Table 表格详解 HTML中的table可以大致分为三个部分: thead ---------表格的页眉 tbody ---------表格的主体 tfoot ---------定义 ...

  4. 简述Python的深浅拷贝以及应用场景

    深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...

  5. SQL实战

    一.表关系 二.操作表 1.自行创建测试数据 表结构和数据 SET NAMES utf8;SET FOREIGN_KEY_CHECKS = 0; -- ------------------------ ...

  6. NPOI 导入 导出

    using NPOI.XSSF.UserModel;   using System.IO; 导入 /// <summary> /// Excel转换DataTable /// </s ...

  7. Python爬虫:获取新浪网新闻

    代码 #coding:utf-8 import requests from bs4 import BeautifulSoup res = requests.get("http://news. ...

  8. Hadoop学习基础之三:MapReduce

    现在是讨论这个问题的不错的时机,因为最近媒体上到处充斥着新的革命所谓“云计算”的信息.这种模式需要利用大量的(低端)处理器并行工作来解决计算问题.实际上,这建议利用大量的低端处理器来构建数据中心,而不 ...

  9. Spring笔记:事务管理

    Spring笔记:事务管理 事务管理 Spring事务管理是通过SpringAOP去实现的.默认情况下Spring在执行方法抛出异常后,引发事务回顾,当然你可以用拦截器或者配置去改变它们. 这部门内容 ...

  10. iOS Healthkit 使用探索分析 🌛

    一 基本认知层面: HealthKit框架提供了一个结构,应用可以使用它来分享健康和健身数据.HealthKit管理从不同来源获得的数据,并根据用户的偏好设置,自动将不同来源的所有数据合并起来.应用还 ...