设计模式3

130 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

单例模式

单例模式是为了保证在一个进程中,某个类有且仅有一个实例。

export{}
class Window{
    private static instance:Window;
    private constructor(){}
    public static getInstance(){
        if(!Window.instance){
            Window.instance = new Window();
        }
        return Window.instance;
    }
}
//把Window做成单例
let w1=Window.getInstance();
let w2=Window.getInstance();
console.log(w1===w2);

/**
 * 透明单例
 * 客户端或者说使用者并不需要知道要按单例使用
 */
export{}
let Window = (function(){
    let Window:Window;
    let Window = function(this:Window){
        if(window){
            return window;
        }else{
            return (window = this);
        }
    }
    return Window;
})();
let w1 = new (Window as any)();
let w2 = new (Window as any)();
console.log(w1===w2);

应用场景:

  • common.js
  • jquery
  • bootstrap模态窗口
  • store 缓存

适配器模式

  • 适配器模式又称包装器模式,将一个类的接口转化为用户需要的另一个接口,解决类(对象)之间接口不兼容的问题
  • 旧的接口和使用者不兼容
  • 中间加一个适配器转换接口
//这是需要被适配的类
class Socket{
    output(){
        return '220V';
    }
}
abstract class Power{
    abstract charge():string;
}
class PowerAdaptor extends Power{
    constructor(public Socket:Socket){
        super();
    }
    charge():string{
        retrun this.Socket.output()+'转换为24V';
    }
}
let adaptor = new PowerAdaptor(new Socket());
console.log(adaptor.charge());

应用场景:

  • axios (判断浏览器和node端后进行适配)
  • toAxiosAdaptor:如将jquery的$.ajax转化为toAxiosAdaptor
  • promisify

image.png

  • computed:如小写转大写

image.png

  • tree:如将树形结构转为一维数组
  • Sequelize

image.png

观察者模式

  • 被观察者供维护观察者的一系列方法
  • 观察者提供更新接口
  • 观察者把自己注册到观察者里
  • 在被观察者发生变化时候,调用观察者的更新方法

image.png

image.png

image.png

image.png 场景:

  • 事件绑定

image.png

  • promise