Js-设计模式分析

Ⅰ- 壹 - 什么是设计模式 ?

原生 js 中没有设计模式,它是模仿 java 语言中的设计模式来实现。

设计模式分为三种类型,共23种。

  • 创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
  • 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
  • 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。

Ⅱ - 贰 - 工厂模式

工厂模式就是做一个对象创建的封装,并将创建的对象 return 出去。

工厂模式适用于:

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

工厂模式普通写法:

function CreateMan(name,age) {
    var obj={};
    obj.name=name;
    obj.age=age;
    obj.sayName=function () {
        return this.name;
    };
    return obj;
}
var p1=CreateMan("zhangsan",20);
var p2=CreateMan("wangwu",30);

工厂模式复杂写法,每一个类都应该是一个单独的文件:

class CarFactory{
	static get CAR(){
		return "Car";
	}
	static get BUS(){
		return "Bus";
	}
	static get TAXI(){
		return "TAXI";
	}
	static createCar(type){
		switch(type){
		 case CarFactory.CAR:
		     return new Car();
		 case CarFactory.BUS:
		     return new Bus();
		 case CarFactory.TAXI:
		     return new Taxi();
		}
	}
}

class Car{
	constructor(){
	}
	getName(){
		console.log("这是一个:"+this.constructor.name)
	}
}

class Bus extends Car{
	constructor(){
		super();
	}
}

class Taxi  extends Car{
	constructor(){
		super();
	}
}

var car1=CarFactory.createCar(CarFactory.BUS);
var car2=CarFactory.createCar(CarFactory.TAXI);
car1.getName();//这是一个:Bus
car2.getName();//这是一个:Taxi

Ⅲ - 叁 - 单例模式

单例模式就是运行完成后返回的对象是唯一的,如果已经创建出来就直接返回。
单例模式的普通写法:

var obj;
function getInstance(){
    return obj || (obj={});
}

var s=getInstance();
var o=getInstance();
console.log(s===o);//true

单例模式的复杂写法:

//使用闭包的形式,防止在外部更改 _instance 的值
let ViewModel=(function(){
    var _instance;
    return class ViewModel{
        constructor(){

        }
        static getInstance(){
            if(!_instance) _instance=new ViewModel();
            return _instance;
        }
    }
})();
var a=ViewModel.getInstance();
var b=ViewModel.getInstance();
console.log(a===b);//true

Ⅳ - 肆 - 构造器模式

构造器是一个当新建对象的内存被分配后,用来初始化该对象的一个特殊函数。对象构造器是被用来创建特殊类型的对象的,首先它要准备使用的对象,其次在对象初次被创建时,通过接收参数,构造器要用来对成员的属性和方法进行赋值。

function CreateMan(name,age) {
    this.name=name;
    this.age=age;
    this.toString=function () {
        return this.name+"年龄:"+this.age;
    }
}
var p1=new CreateMan("zhangsan",20);
var p2=new CreateMan("wangwu",30);
console.log(p1.toString());
console.log(p2.toString());

Ⅴ - 伍 - 桥接模式

桥接模式可以理解为将抽象部分与它的实现部分分离,使它们都可以独立地变化。它的本质就是函数的封装,在实现api的时候,桥接模式非常常用。例如 some() 的实现过程,some函数并不关心 fn 里面的具体实现,fn 里面的逻辑也不会被 some 函数的改写影响。

var list = [1,2,3,4,5];
function some(arr,fn){
    for(var i=0;i<arr.length;i++){
    	//如果数组的元素是空,则跳过
        if(arr[i]===undefined) continue;
        //如果fn()的返回结果是true,则返回true
        if(fn(arr[i],i,arr)) return true;
    }
    //默认返回false
    return false;
}
var s = some(list,function(item,index,arr){
    return item>4
})
console.log(s);//true

Ⅵ - 陆 - 外观模式

外观模式是一种无处不在的模式,外观模式提供一个高层接口,这个接口使得客户端或者子系统调用起来更加方法。比如:这样就方便组装,如果一开始就把两个写到一个函数中,那就不能够只单独调用其中一个了。

function getName() {
    return "xiaoming";
}
function getSex() {
    return "man";
}
function getUserInfo() {
    var info=getName()+getSex();
    return info;
}
console.log(getUserInfo());

Ⅶ - 柒 - 代理模式

当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际上访问的是替身对象。替身对象对请求做出一些处理之后,再把请求转交给本体对象。代理和本体的接口具有一致性,本体定义了关键功能,而代理是提供或拒绝对它的访问,或者在访问本体之前做一些额外的事情。
代理模式主要有三种:

  • 保护代理,指拒绝访问主体;
  • 虚拟代理,在控制对主体进行访问时,加入了一些额外的操作;
  • 缓存代理,为一些数据大的运算结果提供暂时的缓存,提升效率(类似于闭包中的局部变量)。
// 主体,发送消息
function sendMsg(msg) {
    console.log(msg);
}

// 代理,对消息进行过滤
function proxySendMsg(msg) {
    // 无消息则直接返回,这是保护代理
    if (typeof msg === "undefined") {
        return;
    }    
    // 有消息则进行过滤,这是虚拟代理
    msg = ("" + msg).replace(/小朋友/g, '');
    sendMsg(msg);
}

sendMsg('你好小朋友'); //你好小朋友
proxySendMsg('你好小朋友'); //你好
proxySendMsg(); 

Ⅷ - 捌 - 观察者模式

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态时,所有依赖于它的对象都会得到通知并被自动更新。通俗点理解,就是面试官是被观察者,而等待通知的人是观察者

观察者模式的三个步骤:添加至观察列表,从观察列表中移除,进行观察。

javascript中平时接触的dom事件,其实就是一种观察者模式的体现:

div.onclick=function click(){ console.log("click" ) }

0 - 0 - 知识点:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用HTML设计vivo官网的需求分析如下: 1. 用户需求:vivo官网的用户需求是最重要的需求之一。用户需要一个简洁、清晰、易于使用和导航的网站,以便他们能够方便地找到自己需要的信息和产品,并与vivo公司进行互动和交流。因此,vivo官网应该具备良好的用户体验和用户界面设计,以满足用户的需求和期望。 2. 设计需求:vivo官网的设计需求是其次重要的需求之一。网站应该具有创新性、吸引力和美观性,并能够体现vivo公司的品牌形象和文化价值。同时,网站的设计应该考虑到不同的用户群体和设备,包括桌面、平板和手机等。因此,设计师需要了解各种设计工具和技术,如Photoshop、Illustrator、CSS、JavaScript等,以实现网站设计的要求。 3. 功能需求:vivo官网的功能需求是其次重要的需求之一。网站应该具有多种功能,包括导航、搜索、购买、在线客服、社交分享等。这些功能需要根据用户需求和行为模式设计和实现,以提供更好的用户体验和服务。因此,开发人员需要了解各种前端技术和框架,如HTML、CSS、JavaScript、React、Angular等,以实现网站的功能需求。 4. 安全需求:vivo官网的安全需求是其次重要的需求之一。网站需要具备安全性和可靠性,以保护用户的隐私和信息安全。这需要开发人员了解各种安全技术和方法,如SSL、HTTPS、防火墙等,以保证网站的安全性和可靠性。 总之,使用HTML设计vivo官网需要考虑用户需求、设计需求、功能需求和安全需求等多方面的需求。只有满足这些需求,才能够设计出一个优秀的vivo官网,为用户提供更好的体验和服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值