首页 > 其他分享 >设计模式-cnblog

设计模式-cnblog

时间:2023-02-05 10:23:06浏览次数:54  
标签:console log plane let base return 设计模式 cnblog

设计模式

1.装饰者模式

  • 不改变对象自身代码的基础上新增功能
// 装饰者模式 
// 不改变对象自身代码的基础上新增功能
let a = ()=>{
    console.log('a');
}
// 开闭原则  
// let newa = ()=>{
//     console.log('a');
//     console.log('b');
// }

// newa();

let newa = ()=>{
    a();
    console.log('b');
}
// newa()
// 飞机大战  发射普通子弹   发射导弹   发射原子弹

function Plane() {

}
Plane.prototype.fire = function () {
    console.log('普通子弹');
}

function  MissileDecorator(plane) {
    this.plane = plane;
}

MissileDecorator.prototype.fire = function () {
    this.plane.fire();
    console.log('导弹');
}

function AtomDecorator(plane) {
    this.plane = plane;
}

AtomDecorator.prototype.fire = function () {
    this.plane.fire(); // 普通子弹 导弹 
    console.log('原子弹');
}

let plane = new Plane();
plane = new MissileDecorator(plane);
plane = new AtomDecorator(plane)
plane.fire();








2. 策略模式

  • 有效解决if,else 不可维护的情况
// 策略模式   有效的解决if else 逻辑复杂不可维护的情况
// s a b c d  
// 5 4 3 2 1
// a   b 
let strategys = {
    s(base){
      console.log('女朋友');
      console.log('iphone');
      return base*5;   
    }, 
    a(base){
      console.log('书包');
      return base*4;   
    },
    b(base){
        return base*3;   
    }, 
    c(base){
        return base*2;   
    },
    d(base){
        return base;   
    },
    e(base){
       return 0;
    }
}

function catulateBonus(base,grade){
    return strategys[grade](base)
}






// function catulateBonus(base,grade){
//     if(grade==='s'){
//       console.log('女朋友');
//       console.log('iphone');
//       return base*5;
//     }else if(grade==='a'){
//       console.log('书包');
//       return base*4;
//     }else if(grade==='b'){
//       console.log('对联');
//       return base*3; 
//     }else if(grade==='c'){
//       return base*2; 
//     } else if(grade==='d'){
//       return base*1; 
//     } else {
//       return 0; 
//     }
// }
// // 老王 
// const result  = catulateBonus(1000,'s');
// console.log(result);
// // 小明
// const resulta  = catulateBonus(2000,'a');
// console.log(resulta);

3. 代理模式

  • 请求转发
// 代理模式   转发请求
// 情景剧: 梁山伯与祝英台的故事
// 梁山伯把玫瑰送给媒婆 并委托替他向祝英台表白
// 鲜花
function Flower(owner,name) {
  this.owner = owner;
  this.name = name;
}
// 主角: 梁山伯
let liangShanbo = {
    sendFlower(target){
        let flower = new Flower('liangShanbo','rose');
        target.receiveFlower(flower);
    }
}
// 二号主人公: 媒婆   
let matchMaker = {
    receiveFlower(flower){
        zhuYingTai.receiveFlower(flower)
    }
}
// 女主角: 祝英台
let zhuYingTai = {
   receiveFlower(flower){
      console.log(`zhuYingTai receive ${flower.name} from ${flower.owner}`);
   }
}

// 梁山伯把玫瑰送给媒婆 并委托替他向祝英台表白
liangShanbo.sendFlower(matchMaker);

4. 发布订阅模式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>发布订阅模式</title>
</head>
<body>
  <!-- 
    发布—订阅模式又叫 观察者模式 
    它定义对象间的一种一对多的依赖关系
    当一个对象的状状 态发生改变时
    所有依赖于它的对象都将得到通知 
  --> 
  <script>
    // 用户就是发布者  document 绑定的click事件
    document.addEventListener('click',(event)=>{
        console.log(event);
    })
  </script>
</body>
</html>

5.迭代器模式

// 迭代器模式

const array = [1,2,3,4,5];

// forEach  迭代器模式 最基础应用
// array.forEach((item,index)=>{
    // console.log(`item:${item}`);
    // console.log(`index:${index}`);
// })

// 倒序迭代器
let reverseEach = function (obj,callback) {
    if(!Array.isArray(obj)){
        throw Error('params is must an array!')
    }
    for (let i = obj.length-1; i>=0; i--) {
        callback.call(obj[i],obj[i],i)
    }
}

reverseEach(array,(item,index)=>{
    console.log(`item:${item}`);
    console.log(`index:${index}`);
})





标签:console,log,plane,let,base,return,设计模式,cnblog
From: https://www.cnblogs.com/lingxin1123/p/17092951.html

相关文章

  • webpack-cnblog
    1.webpack定义用于现代JavaScript的静态模块打包工具解决的问题模块依赖代码编写less转cssts转js开发效率热加载项目优化压缩,打包2.load......
  • 设计模式(四)----创建型模式之单例模式(二)
    1.1.3存在的问题1.1.3.1问题演示破坏单例模式:使上面定义的单例类(Singleton)可以创建多个对象,枚举方式除外。有两种方式,分别是序列化和反射。序列化反序列化Singlet......
  • 一篇文章带你了解设计模式——行为型模式
    一篇文章带你了解设计模式——行为型模式在之前的文章我们已经介绍了设计模式中的创建者模式和结构型模式,下面我们来介绍最后一部分行为型模式行为型模式用于描述程序在......
  • 修改表时先删除后添加思想-cnblog
    4.3.2修改菜品信息4.3.2.1代码实现点击保存按钮,页面发送ajax请求,将修改后的菜品相关数据以json形式提交到服务端。在修改菜品信息时需要注意,除了要更新dish菜品表,还需......
  • 线程变量-cnblog
    1.3.2ThreadLocalThreadLocal并不是一个Thread,而是Thread的局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程......
  • spring-data-redis-cnblog
    5.3SpringDataRedis5.3.1介绍SpringDataRedis是Spring的一部分,提供了在Spring应用中通过简单的配置就可以访问Redis服务,对Redis底层开发包进行了高度封装......
  • number类型id和String类型id处理-cnblog
    4.4功能测试代码编写完毕之后,我们需要将工程重启。然后访问前端页面,进行"启用"或"禁用"的测试。测试过程中没有报错,但是功能并没有实现,查看数据库中的数据也没有......
  • 事务管理-cnblog
    4).DishServiceImpl中实现方法saveWithFlavor页面传递的菜品口味信息,仅仅包含name和value属性,缺少一个非常重要的属性dishId,所以在保存完菜品的基本信息后,我们需要获......
  • 全局异常处理解决重复添加同一用户-cnblog
    2.6全局异常处理2.6.1思路分析要想解决上述测试中存在的问题,我们需要对程序中可能出现的异常进行捕获,通常有两种处理方式:A.在Controller方法中加入try...catch进行......
  • 过滤器实现登录拦截-cnblog
    1.3代码实现1).定义登录校验过滤器自定义一个过滤器LoginCheckFilter并实现Filter接口,在doFilter方法中完成校验的逻辑。那么接下来,我们就根据上述分析的步骤......