设计模式之实战(8-1)

简介: 设计模式之实战(8-1)

1、写一个购物车 UML 类图

网络异常,图片无法展示
|

网络异常,图片无法展示
|

网络异常,图片无法展示
|

  • 自己画一遍

网络异常,图片无法展示
|

2、写代码之 环境准备

1、配置一下 代理

网络异常,图片无法展示
|

2、新建 json 文件

  • 然后 http-server -p 8880 启动服务

网络异常,图片无法展示
|

3、安装 jQuery  yarn add jquery --save

4、需要一个容器 div

网络异常,图片无法展示
|

5、初始化 App.js

网络异常,图片无法展示
|

6、index.js

网络异常,图片无法展示
|

3、实现 List 组件

1、完善 App.js

import $ from "jquery";
export default class App {
  constructor(id) {
    this.$el = $("#" + id);
  }
  // 初始化购物车
  initShoppingCart() {}
  // 初始化列表
  initList() {}
  init() {
    this.initShoppingCart();
    this.initList();
  }
}
复制代码

2、新建 List 文件夹和 ShoppingCart 文件夹

网络异常,图片无法展示
|

网络异常,图片无法展示
|

网络异常,图片无法展示
|

  • List 执行 差不多相同的操作

网络异常,图片无法展示
|

网络异常,图片无法展示
|

3、demo下 新建 config.js文件

网络异常,图片无法展示
|

4、完善 List.js

import $ from "jquery";
import { GET_LIST } from "../config/config";
export default class List {
  constructor(app) {
    this.app = app;
    this.$el = $("<div>"); // 创建div
  }
  // 获取数据
  loadData() {
    // 返回 Promise 实例
    return fetch(GET_LIST).then((result) => {
      return result.json();
    });
  }
  // 生成列表
  initItemList(data) {
    data.map((initData) => {
      // 创建一个 Item 然后 init
    });
  }
  // 渲染
  render() {
    this.app.$el.append(this.$el); // 将当前的div(this.$el) 插入到app的$el里面去
  }
  init() {
    // 先加载数据
    this.loadData()
      .then((data) => {
        // 然后 渲染列表
        this.initItemList(data);
      })
      .then(() => {
        // 最后执行 渲染
        this.render();
      });
  }
}
复制代码

5、完善 json文件

6、写Cart

  • 此处 没有直接 写 一个 class Cart 而是 使用 单例模式
constructor() {
    this.list = []; // 初始化 数组
  }
  add(data) {
    this.list.push(data); //  经典的 数组 push 方法
  }
  del(id) {
    this.list = this.list.filter((item) => {
      // 经典 数组 filter 方法
      if (item.id === id) {
        return false;
      }
      return true;
    });
  }
  getList() {
    return this.list
      .map((item) => {
        //  经典数组 map 方法
        return item.name;
      })
      .join("\n"); // 经典 join 进行连接
  }
}
// js 返回单例  使用 匿名函数
let getCart = (function () {
  let cart;
  return function () {
    if (!cart) {
      cart = new Cart();
    }
    return cart;
  };
})();
export default getCart; //  此处导出的是 函数 而不是 Cart  class 类
复制代码
  • 非常的精彩

7、List 文件夹下 新建 Item.js

import $ from "jquery";
import getCart from "../ShoppingCart/GetCart";
class Item {
  constructor(list, data) {
    this.$el = $("<div>");
    this.list = list;
    this.data = data;
    this.cart = getCart();
  }
  initContent() {
    let $el = this.$el;
    let data = this.data;
    $el.append($(`<p>名称: ${data.name}</p>`));
    $el.append($(`<p>价格: ${data.price}</p>`));
  }
  initBtn() {
    let $el = this.$el;
    let $btn = $("<button>test</button>");
    $btn.click(() => {
      // 添加购物车
      // 从购物车 删除
    });
    $el.append($btn);
  }
  // 添加到购物车
  addToCartHandle() {
    this.cart.add(this.data);
  }
  // 从购物车删除
  deleteFromCartHandle() {
    this.cart.del(this.data.id);
  }
  render() {
    this.list.$el.append(this.$el);
  }
  init() {
    this.initContent();
    this.initBtn();
    this.render();
  }
}
复制代码

8、List下 新建 CreateItem.js

  • 函数内 return new XXX() 为典型的工厂模式
import Item from "./Item";
// 后续会补充 优惠商品的处理逻辑
// 工厂函数
export default function (list, itemData) {
  return new Item(list, itemData);
}
复制代码

9、List.js 中使用 这个工厂函数

网络异常,图片无法展示
|

网络异常,图片无法展示
|

10、完善 Item.js 使用 状态机控制 按钮状态的变化

import getCart from "../ShoppingCart/GetCart";
import { StateMachine } from "javascript-state-machine";
class Item {
  constructor(list, data) {
    this.$el = $("<div>");
    this.list = list;
    this.data = data;
    this.cart = getCart();
  }
  initContent() {
    let $el = this.$el;
    let data = this.data;
    $el.append($(`<p>名称: ${data.name}</p>`));
    $el.append($(`<p>价格: ${data.price}</p>`));
  }
  initBtn() {
    let $el = this.$el;
    let $btn = $("<button>");
    let fsm = new StateMachine({
      init: "加入购物车",
      transitions: [
        {
          name: "addToCart",
          from: "加入购物车",
          to: "从购物车删除",
        },
        {
          name: "deleteFromCart",
          from: "从购物车删除",
          to: "加入购物车",
        },
      ],
      methods: {
        // 加入购物车
        onAddToCart: () => {
          this.addToCartHandle();
          updateText();
        },
        // 从购物车 删除
        onDeleteFromCart: () => {
          this.deleteFromCartHandle();
          updateText();
        },
      },
    });
    function updateText() {
      $btn.text(fsm.state);
    }
    $btn.click(() => {
      // 添加购物车
      // 从购物车 删除
      if(fsm.is('加入购物车')){
          fsm.addToCart()
      }else{
          fsm.deleteFromCart()
      }
    });
    updateText();
    $el.append($btn);
  }
  // 添加到购物车
  addToCartHandle() {
    this.cart.add(this.data);
  }
  // 从购物车删除
  deleteFromCartHandle() {
    this.cart.del(this.data.id);
  }
  render() {
    this.list.$el.append(this.$el);
  }
  init() {
    this.initContent();
    this.initBtn();
    this.render();
  }
}
复制代码

11、完善 shoppingCart.js

import $ from 'jquery'
import getCart from './GetCart.js'
export default class ShoppingCart {
    constructor(app) {
        this.app = app
        this.$el = $('<div>').css({
            'padding-bottom': '10px',
            'border-bottom': '1px solid #ccc'
        })
        this.cart = getCart()
    }
    // 显示购物车内容
    showCart() {
        alert(this.cart.getList())
    }
    // 初始化按钮
    initBtn() {
        let $btn = $('<button>购物车</button>')
        $btn.click(() => {
            this.showCart()
        })
        this.$el.append($btn)
    }
    // 渲染
    render() {
        this.app.$el.append(this.$el)
    }
    init() {
        this.initBtn()
        this.render()
    }
}
复制代码

12、基本功能完结!



相关文章
|
6月前
|
设计模式 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 设计模式与实战应用
【4月更文挑战第30天】本文探讨JavaScript设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
83 0
|
6月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
69 1
|
2月前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
3月前
|
设计模式 存储 Java
掌握Java设计模式的23种武器(全):深入解析与实战示例
掌握Java设计模式的23种武器(全):深入解析与实战示例
|
3月前
|
前端开发 开发者 开发框架
JSF与Bootstrap,打造梦幻响应式网页!让你的应用跨设备,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,响应式设计至关重要,以确保不同设备上的良好用户体验。本文探讨了JSF(JavaServer Faces)与Bootstrap框架的结合使用,展示了如何构建响应式网页。JSF是一个基于Java的Web应用框架,提供丰富的UI组件和表单处理功能;而Bootstrap则是一个基于HTML、CSS和JavaScript的前端框架,专注于实现响应式设计。通过结合两者的优势,开发者能够更便捷地创建自适应布局,提升Web应用体验。然而,这种组合也有其局限性,如JSF组件库较小和较高的学习成本等,因此在选择开发框架时需综合考虑具体需求和应用场景。
50 0
|
3月前
|
设计模式 前端开发 开发者
Angular携手Material Design:探索设计模式下的UI组件开发之道——从按钮到对话框的全面实战演示
【8月更文挑战第31天】在现代Web应用开发中,Angular框架结合Material Design设计原则与组件库,显著提升了用户界面的质量与开发效率。本文通过具体代码示例,详细介绍如何在Angular项目中引入并使用Material Design的UI组件,包括按钮、表单和对话框等,帮助开发者快速构建美观且功能强大的应用。通过这种方式,不仅能提高开发效率,还能确保界面设计的一致性和高质量,为用户提供卓越的体验。
31 0
|
5月前
|
设计模式 算法 Java
Java中的设计模式:实战案例分享
Java中的设计模式:实战案例分享
|
5月前
|
设计模式 存储 前端开发
【设计模式】MVC与MVVM详尽解读与实战指南
【设计模式】MVC与MVVM详尽解读与实战指南
880 0
|
6月前
|
设计模式 算法 Java
Java 设计模式:探索策略模式的概念和实战应用
【4月更文挑战第27天】策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在 Java 中,策略模式通过定义一系列的算法,并将每一个算法封装起来,并使它们可以互换,这样算法的变化不会影响到使用算法的客户。
75 1
|
6月前
|
设计模式 Java 数据库连接
JAVA设计模式解析与实战
本文探讨了Java中的常见设计模式,包括单例模式、工厂模式和观察者模式。单例模式确保类只有一个实例,常用于管理资源;工厂模式通过抽象工厂接口创建对象,降低了耦合度;观察者模式实现了一对多的依赖关系,当主题状态改变时,所有观察者都会收到通知。理解并运用这些设计模式能提升代码的复用性、可扩展性和可维护性。

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    43
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    48
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    58
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    63
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    58
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    42
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    110
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78
  • 下一篇
    无影云桌面