js设计模式观察者模式 (js策略模式设计)

代理模式

代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。也可以说:帮别人做事。

代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。

生活中有很多的代理模式的场景。例如,明星有经纪人作为代理,老板有秘书作为代理等等,当有事情的时候,会找到经纪人或秘书,再由他们转达给明星或者老板。

demo1

我们来举一个简单的例子,假如男朋友要送女朋友玫瑰花,因为距离太远(异地),想委托店员去送这些玫瑰,那店员就是个代理,那我们如何来做呢?

// 先声明女朋友对象
var girl = function (name) {
    this.name = name;
};
 
 
// 男朋友
var dudu = function (girl) {
    this.girl = girl;
    this.sendGift = function (gift) {
        alert("Hi " + girl.name + ", 男朋友送你一个礼物:" + gift);
    }
};
 
 
// 花店店员是代理
var proxyTom = function (girl) {
    this.girl = girl;
    this.sendGift = function (gift) {
        (new dudu(girl)).sendGift(gift); // 替dudu送花咯
    }
};
//调用
var proxy = new proxyTom(new girl("女朋友花花"));
proxy.sendGift("999朵玫瑰");

保护代理

通过代理来处理一些不必要的东西,过滤无用信息,可以理解为保护代理。

虚拟代理

根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,比如浏览器的渲染的时候先显示问题,而图片可以慢慢显示(就是通过虚拟代理代替了真实的图片,此时虚拟代理保存了真实图片的路径和尺寸。

// 真实对象              代理对象       用户 
//原图,很大,加载瞒     很小,加载快    浏览器		
//代理模式特点:代理对象与真实对象拥有同样的行为

//真实对象 闭包
var myImage=function(){
  var imgNode =document.createElement("img");
  document.body.appendChild(imgNode);
  return {
    setSrc:function(src){
      imgNode.src=src;
    }
  }
})();

// 代理对象 先展示loading等待图片 接着负责拉取真实图片
var ProxyImage=(function(){
  var img=new Image(); //内存中的一个图片对象 代理 拉真实图片
  img.onload=function(){ //加载完毕 触发该方法
    myImage.setSrc(this.src);//this==img 真实图片给真实对象展示
  }
  return {
    setSrc:function(src){
      myImage.setSrc("加载中的gif图src");
      img.src=src; //真实图片
    }
  }
})();
// 调用 ->把真实图片给到代理对象
ProxyImage.setSrc("原图地址路径src");