设计模式之实战(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设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
82 0
|
6月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
68 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组件库较小和较高的学习成本等,因此在选择开发框架时需综合考虑具体需求和应用场景。
49 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详尽解读与实战指南
871 0
|
6月前
|
设计模式 算法 Java
Java 设计模式:探索策略模式的概念和实战应用
【4月更文挑战第27天】策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在 Java 中,策略模式通过定义一系列的算法,并将每一个算法封装起来,并使它们可以互换,这样算法的变化不会影响到使用算法的客户。
74 1
|
6月前
|
设计模式 Java 数据库连接
JAVA设计模式解析与实战
本文探讨了Java中的常见设计模式,包括单例模式、工厂模式和观察者模式。单例模式确保类只有一个实例,常用于管理资源;工厂模式通过抽象工厂接口创建对象,降低了耦合度;观察者模式实现了一对多的依赖关系,当主题状态改变时,所有观察者都会收到通知。理解并运用这些设计模式能提升代码的复用性、可扩展性和可维护性。