js适配器模式
适配器模式,将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
在以下情况下可以考虑使用适配器模式:
- 系统需要复用现有类,而该类的接口不符合系统的需求
- 想要建立一个可重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
- 对于对象适配器模式,在设计里需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
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); //输出:开始渲染百度地图
小结:
- 适配器模式主要用来解决两个已有接口之间不匹配的问题,它不考虑这些接口是怎样实现的,也不考虑它们将来可能会如何演化。适配器模式不需要改变已有的接口,就能够使它们协同作用。
- 装饰者模式和代理模式也不会改变原有的对象的接口,但装饰者模式的作用是为了给对象增加功能。装饰者模式常常形成一条长的装饰链,而适配器模式通常只包装一次。代理模式是为了控制对对象的访问,通常也只包装一次。
- 外观模式的作用倒是和适配器比较相似,有人把外观模式看成一组对象的适配器,但外观模式最显著的特点是定义了一个新的接口。
js适配器模式的更多相关文章
- JS常用的设计模式(4)——适配器模式
去年年前当时正在开发dev.qplus.com, 有个存储应用分类id的js文件, 分类id的结构最开始设计的比较笨重. 于是我决定重构它. 我把它定义成一个json树的形式, 大概是这样: var ...
- 《JS设计模式笔记》 5,适配器模式
//适配器模式的作用就像一个转接口. jQuery("#"+id); $id=function (id) { return jQuery("#"+id)[0]; ...
- js设计模式(6)---适配器模式
0.前言 脖子又开始痛了,难道还没成为码农就开始出现颈椎问题,一直以来举得自己不算那种死宅的人,怎么这么年轻就出现这种问题.哎,不管了,还是先把自己学习的适配器模式写出来,算是一种总结吧. 1.为什么 ...
- JS设计模式(14)适配器模式
什么是适配器模式? 定义:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 主要解决:主要解决在软件系统中,常常要将一些"现存 ...
- JS设计模式——11.适配器模式
适配器模式概述 适配器模式可用来在现有接口和不兼容的类之间进行适配.使用这种模式的对象又叫包装器(wrapper). 适配器特点 从表面看,适配器模式很像门面模式.她们都要对别的对象进行包装并改变其呈 ...
- js设计模式-适配器模式
说明:适配器模式表面上看起来像门面模式.它们都要对别的对象进行包装并改变其呈现的接口.但是两者的差别在于它们如何改变接口.门面元素展现的是一个简化的接口,它并不提供额外的选择,而且有时为了方便完成常见 ...
- js原生设计模式——10适配器模式之参数适配器
原理:参数适配器说白了就是给出要带入数据字段的对应字段的默认值,一旦数据字段值不足,就取默认值补足. [写法一]:直接返回 <!DOCTYPE html><html lang=&qu ...
- 我对Backbone.js的一些认识
backbone.js已经不是当前最流行的前端框架了,但是对于我而言,依然具有比较好的学习价值.虽然目前来说,react,vue等mvvm框架非常火热,但是感觉自身还不到去使用这种框架的层次.这些技术 ...
- 《Node.js开发实战详解》学习笔记
<Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
随机推荐
- jQuery插件——1.编写规则
jQuery插件编写规则如下: 1.命名规则:jquery.[插件名称].js 2.所有对象方法都应当附加到jQuery.fn对象上:所有的全局方法都应当附加到jQuery对象上. 3.在插件内部,t ...
- commit Commit changes to stable storage 对变化提交
Python36\site-packages\pymysql\connections.py # Python implementation of the MySQL client-server pro ...
- JavaScript正则中\1\2的作用
一.示例 1. 验证6个相同的数字 var reg = new RegExp(/^(\d)\1{5}/g); var a = '333333'; if(reg.test(a)) { alert('ri ...
- ArcGIS for window mobile 数据打开
前言 环境信息:ArcGIS for windows mobile 10.1.1,ArcGIS runtime sdk for windows mobile 10.1.1 一.MapCache的打开 ...
- Python:itertools模块(转)
原文:http://www.cnblogs.com/cython/articles/2169009.html itertools模块包含很多创建迭代器的函数,可以用各种方式对数据进行循环操作,此模块中 ...
- JavaWeb—过滤器Filter
1.Filter简介 Filter称之为过滤器,是用来做一些拦截的任务.比如客户端请求服务器的某个资源时(可以是Servlet.JSP.HTML等等),我们可以拦截.当服务器返回资源给客户端的时候,我 ...
- (转)js原生自定义事件的触发dispatchEvent
1. 对于标准浏览器,其提供了可供元素触发的方法:element.dispatchEvent(). 不过,在使用该方法之前,我们还需要做其他两件事,及创建和初始化.因此,总结说来就是: 1 2 3 d ...
- 剑指offer 面试15题
面试15题: 题目:二进制中1的个数 题:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题思路一: 最佳方法:把一个整数减去1,再和原整数做“与运算”,会把该整数最右边的1变成0 ...
- $git学习总结系列(1)——基本用法
廖雪峰的官方网站:http://www.liaoxuefeng.com/ 本文是学习廖雪峰的官方网站上git教程git基本用法的总结,详细内容可以进入廖雪峰的官方网站查看. 注:本文中的主要内容都是基 ...
- Hearbeat 介绍
Hearbeat 介绍 Linux-HA的全称是High-Availability Linux,它是一个开源项目,这个开源项目的目标是:通过社区开发者的共同努力,提供一个增强linux可靠性(reli ...