设计模式(2)

1.代理模式

      代理模式即为一个对象提供一个代用品或者占位符,以便控制它的访问。当对象1不方便直接访问对象2或者不满足需求的时候,提供一个替身对象3来访问对象2,替身对象3对请求做出一些处理后,再把请求转交给本体对象1。

      作用:在某些情况下可以起到保护访问对象和节约成本的作用。

      实例如下:

    // 邓哥让成哥帮忙转交花给一个女神
    // 对象成哥,拿到邓哥的花后执行函数reserve()
    var chengge = {
      reserve: function (target, flower) {
        target.listenhappy(function () {
          target.reserve(flower)
        })
      }
    }
    // 对象邓哥,自己私用变量送给谁:"xiaohua",送什么:"向日葵"
    var dengge = {
      getFlower: "向日葵",
      girl: new Girl("xiaohua"),
      chengge: chengge,
      sendFlower: function () {
        var flowers = this.getFlower;
        var girl = this.girl;
        var target = this.chengge;
        target.reserve(girl, flowers)
      }
    }
    // 构造函数Girl可new一个被访问对象
    function Girl(name) {
      return {
        girlName: name,
        // 收到花后的响应
        reserve: function (flower) {
          console.log(this.girlName + "收到:" + flower)
        },
        // 监听自己心情
        listenhappy: function (fn) {
          setTimeout(() => {
            console.log(this.girlName + "心情好了")
            fn()
          }, 2000)
        }
      }
    }
    // 邓哥将?给到成哥后,成哥转交给女神
    dengge.sendFlower(chengge)

 2.迭代器模式

       提供一个方法去顺序访问一个聚合对象中的元素,而不暴露该对象的内部表示

       实例如下:

 // 提供一种方法顺序去访问一个聚合对象中的各个元素,而且不暴露该对象的内部表示
    var arr = [3, 5, 2],
      index = 0,
      len = arr.length
    var iterator = function (obj) {
      return {
        next: function () {
          if (this.hasnext) {
            var item = obj[index];
            index++
            return item  
          } else {
            return false;
          }
        },
        hasnext: function () {
          return index < len;
        },
        current: function () {
          return obj[index - 1]
        }
      }
    }

    var arriterator = iterator(arr)
    console.log(arriterator.next());
    // 3
    console.log(arriterator.next());
    // 5
    console.log(arriterator.next());
    // 2
    console.log(arriterator.current());
    // 2
    console.log(arriterator.next());
    // undefined

3.工厂模式

       个人理解是一个实例对象可以调用各种方法来给自己添加属性,功能,使之成为一类产品

       实例如下:

//  造车工厂1
    function CarFactory() { }
    CarFactory.BMW = function () {
      this.name = "宝马"
    }
    CarFactory.Benz = function () {
      this.name = "奔驰"
    }
    CarFactory.Audi = function () {
      this.name = "奥迪"
    }
    CarFactory.prototype.drive = function () {
      return "该批次" + this.name + "添加了自动驾驶功能"
    }
    CarFactory.create = function (carName) {
      if (typeof (CarFactory[carName]) === "undefined") {
        console.log("无法建造" + carName)
        return false
      }
      if (typeof (CarFactory[carName].prototype.drive) !== "function") {
        CarFactory[carName].prototype = new CarFactory()
      }
      var newCar = new CarFactory[carName];
      return newCar
    }
    console.log(new CarFactory())
    var car = CarFactory.create("BMW")
    console.log(car.drive())

    //造车工厂2 
    function CarFactory(carName) {
      this[carName] = function () {
        this.name = carName
      }
    }

    CarFactory.prototype.drive = function () {
      return "该批次" + this.name + "添加了自动驾驶功能"
    }

    CarFactory.create = function (carName) {
      if (typeof (CarFactory[carName]) === "undefined") {
        console.log("无法建造" + carName)
        return false
      }
      if (typeof (CarFactory[carName].prototype.drive) !== "function") {
        CarFactory[carName].prototype = new CarFactory()
      }
      var newCar = new CarFactory[carName];
      return newCar
    }
    var mycar = new CarFactory("BMW")
    console.log(car)

 

转载于:https://www.cnblogs.com/xuluchun/p/8970225.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值