看看用TypeScript怎样实现常见的设计模式,顺便复习一下。

学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想记住就好。

这里尽量用原创的,实际中能碰到的例子来说明模式的特点和用处。

适配器模式 Adapter

特点:把类或接口转换成另一个接口以便系统调用。

用处:当系统需要引入多个功能类并且这些功能的接口不统一时可以考虑用适配器模式把它们转成统一的接口,现实中的例子很多,比如充电器接口适配器。

注意:分为对象适配器和类适配器。

适配器模式的目的主要在于解决接口兼容性。

下面用TypeScript简单实现一下适配器模式:

假定现在项目已经在用一个画图接口Graph以及它的实现Canvas2D:

interface Graph{
drawLine(); drawPie();
} class Canvas2D implements Graph{
drawLine(){
console.log('draw 2d line');
} drawPie(){
console.log('draw 2d pie');
}
}

项目升级需要提高UI美观,引入3D画图库Canvas3D,两者接口不一样:

class Canvas3D{
draw3DLine(){
console.log('draw 3d line');
} draw3DPie(){
console.log('draw 3d pie');
}
}

项目是依赖接口Graph的,如果要直接加上3d功能就需要改接口,这个代价比较大,这时适配器派上用场:

class Canvas3DAdapter implements Graph{
private canvas3D: Canvas3D = new Canvas3D(); drawLine(){
this.canvas3D.draw3DLine();
} drawPie(){
this.canvas3D.draw3DPie();
}
} let canvas2D: Graph = new Canvas2D();
canvas2D.drawLine();
canvas2D.drawPie(); let canvas3D: Graph = new Canvas3DAdapter();
canvas3D.drawLine();
canvas3D.drawPie(); //输出
draw 2d line
draw 2d pie draw 3d line
draw 3d pie

这样,使用时用Canvas3DAdapter就可以了,项目还是只依赖Graph这个接口就可以画出3D图。

在Canvas3DAdapter里引入了Canvas3D对象,可以看出这是对象上的行为适配,所以叫对象适配器。

另外还有一种叫类适配器,使用多重继承来使新的适配类继承原来接口并且拥有两个类的功能,在TypeScript里虽然不能用多重继承,但是可以用mixins方式强行加起来,这里就不写例子了。

外观模式 Facade

特点:给子系统定义一个统一的接口来方便外面调用,并且可以减少对子系统的直接依赖。

用处:当系统实现一个功能需要调用其他库或第三方库的很多功能时,需要有个统一调用维护的地方,这时可以考虑外观模式。

注意:和适配器的区别。

外观模式的目的主要在于简化调用,只需要一个简单的接口就可以解除对其他类的依赖。

下面用TypeScript简单实现一下外观模式:

假定现在项目的需求是实现一个简单图表的功能来画出近年来收入曲线图和收入来源配比图,引入一个第三方绘图库。

//第三方绘图库
class Axis{
draw(); // 画坐标轴
} class Line{
draw(); // 画曲线
} class FanShape{
draw(angle: number); // 画扇形
}

项目没必要和第三方的库紧耦合,所以按需求抽象出一个接口Graph:

// 项目接口
interface Graph{ // 只需要两种图表, 线图和饼图
drawLineChart(); drawPieChart();
}

再用第三方库里的画图功能实现这个接口:

class Chart implements Graph{ // 实现接口
drawLineChart(){
new Axis().draw();
new Line().draw();
} drawPieChart(){
new FanShape().draw(90);
new FanShape().draw(180);
new FanShape().draw(90);
}
}

这样项目只需要通过Graph接口来画图表就好了,而不用知道具体的细节。

与适配器相同的点是同样是一种封装处理,不同的是适配器已有一个接口,而用这个接口不能使用另外一个系统,这时需要把那个系统做个适配来匹配现有接口,重点在于兼容接口,解决冲突。

而外观则是封装现有系统来对外提供一种简单的使用方式,重点在于简化调用。

TypeScript设计模式之门面、适配器的更多相关文章

  1. python 设计模式之门面模式

    facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单接口的对象,就像类库.   门面模式被归入建筑设计模式.门面模式隐藏系统内部的细 ...

  2. 【TS】358- 浅析 TypeScript 设计模式

    点击上方"前端自习课"关注,学习起来~ 作者:DD菜 https://zhuanlan.zhihu.com/p/43283016 设计模式就是软件开发过程中形成的套路,就如同你在玩 ...

  3. 设计模式_Facade_门面模式

    形象例子: 我有一个专业的Nikon相机,我就喜欢自己手动调光圈.快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会.幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门 ...

  4. TypeScript设计模式之单例、建造者、原型

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 单例模式 Singleton 特点:在程序的生命周期内只有一个全局的实例,并且不能再new出新的实例. 用处:在一些只需要一个对象存在 ...

  5. TypeScript设计模式之工厂

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...

  6. TypeScript设计模式之策略、模板方法

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...

  7. TypeScript设计模式之备忘录、命令

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...

  8. TypeScript设计模式之职责链、状态

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...

  9. TypeScript设计模式之中介者、观察者

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...

随机推荐

  1. 使用(Drawable)资源——StateListDrawable资源

    StateListDrawable用于组织多个Drawable对象.当使用StateListDrawable作为目标组件的背景.前景图片时,StateListDrawable对象所显示的Drawabl ...

  2. XML文档的PHP程序查询代码

    PHP文档: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " http://www ...

  3. MVC使用HandleErrorAttribute自定义异常

    MVC中,有一个Filter可以捕捉错误,但是它的用法是利用Attribute来实现的,而且只能加在Controller和Action上,所以不能捕捉别出的错误 其实理论上所有的错误肯定产生于Cont ...

  4. 在JS中使用COM组件的方法

    首先创建一个COM组件,插入一个双接口Itest,在此接口上实现以下三个方法: STDMETHODIMP Ctest::test(void) //无输入输出参数 { // TODO: 在此添加实现代码 ...

  5. 【js编程艺术】小制作六

    1.html /* movie.html*/<!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

  6. office如何去除多页签

    写文档会遇到同时打开多个文档,偶尔可能需要对比,而有时office会出现跟浏览器类似的多页签界面.如何去除多页签,office本身没有此加载项,一般都是作为插件或组件形式另外安装,导致我们不知道从哪里 ...

  7. gulp源码解析(二)—— vinyl-fs

    在上一篇文章我们对 Stream 的特性及其接口进行了介绍,gulp 之所以在性能上好于 grunt,主要是因为有了 Stream 助力来做数据的传输和处理. 那么我们不难猜想出,在 gulp 的任务 ...

  8. Ubuntu 制作U盘启动盘

    部门需要一台Linux系统远程共享服务器,需要一个启动盘安装.但是由于公司windows 系统都安装了保安软件,而且软件的使用也是有限制的.所以不能使用UltraISO 这类软件制作U盘启动盘.还好部 ...

  9. AFNetworking2.0和AFNetworking3.0 的HTTPS的配置

    前言: 由于苹果声明在前说是2017.01.01之后提交审核的APP,必须使用HTTPS请求,要不就直接驳回审核,吓得我们年前赶紧提交了一个版本,想着年后在弄这个https,结果又有消息说是苹果推迟了 ...

  10. IP查询接口

    腾讯的: http://fw.qq.com/ipaddress直接返回本机的IP地址对应的地区新浪的:http://counter.sina.com.cn/ip?ip=IP地址返回Js数据,感觉不是很 ...