<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[拾荒者]]></title><description><![CDATA[我是精神的拾荒者， 孤独的，行走在广阔的天地，背包是我的生命，不停留，不富有]]></description><link>https://blog.youkuaiyun.com/TuoHai_</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; TuoHai_]]></copyright><item><title><![CDATA[设计模式之外观模式]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/107018613</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/107018613</guid><author>TuoHai_</author><pubDate>Mon, 29 Jun 2020 13:41:21 +0800</pubDate><description><![CDATA[外观模式是封装思想的一种表现形式，它可以帮助我们隐藏系统的复杂性，只给用户提供一个可以访问的接口。 外观模式非常容易理解和实现，它属于结构型设计模式。

场景模拟

假设一台电脑，它包含了 CPU（处理器），Memory（内存） ，Disk（硬盘）这几个部件，若想要启动电脑，则先后必须启动 CPU、Memory、Disk，关闭时也需要按照相应顺序。利用门面模式可以将开关过程简化。

 class CPU {   
    startup():void{  
       console.log("cpu s]]></description><category></category></item><item><title><![CDATA[设计模式之装饰器模式]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/107002447</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/107002447</guid><author>TuoHai_</author><pubDate>Sun, 28 Jun 2020 16:51:54 +0800</pubDate><description><![CDATA[装饰器模式允许向一个现有的对象添加新功能，同时又不改变其结构。装饰器模式用于对现有类的包装，它属于结构型模式。
一般的，我们为了扩展一个类经常使用继承方式实现，由于继承为类引入静态特征，并且随着扩展功能的增多，子类会很膨胀。
动态地给一个对象添加一些额外的职责。就增加功能来说，装饰器模式相比生成子类更为灵活。

场景模拟

装饰器模式在游戏中应用非常广泛，比如LOL英雄升级，每次英雄升级都会附加一个额外技能学习的场景。英雄升级是原有结构，所学习技能便是一个附加描述。
interface Hero {
   ]]></description><category></category></item><item><title><![CDATA[设计模式之组合模式]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/106944058</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/106944058</guid><author>TuoHai_</author><pubDate>Wed, 24 Jun 2020 15:15:05 +0800</pubDate><description><![CDATA[组合模式是一种树状结构的专用模式，主要用来组合对象。它可以比较清晰的显示出部分和整体层次，因为这种模式的妙用在于整合而不是创建，因此我们常把他看做结构型模式的一种。

场景描述

某公司CEO下设有销售经理和市场经理，两个经理下各自有自己的下属员工，现遍历公司人员结构树，打印所有人员的薪资职位等状况。


代码实现

下面是改写自菜鸟教程的一段示例代码：

class Employee {
    name: string;
    dept: string;
    salary: number;
   ]]></description><category></category></item><item><title><![CDATA[过滤器模式与责任链模式]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/106917410</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/106917410</guid><author>TuoHai_</author><pubDate>Tue, 23 Jun 2020 10:56:28 +0800</pubDate><description><![CDATA[过滤器模式又被称为标准模式，这种模式主要使用不同标准来过滤一组对象。过滤的过程便是一个层层筛选的过程，因此过滤器模式属于结构型设计模式的一种。
由于实际开发中过滤器模式的使用方式往往要和责任链模式结合使用。所以这里也需要一并介绍下责任链模式。
责任链模式顾名思义就是创建一个链条，经过这个链条处理的所有对象和数据分别进行依次加工，每个环节负责处理不同的业务，环节间彼此独立解耦，同时可以复用。
使用过gulp的同学应该很好理解责任链，因为gulp本身的文件处理机制便是基于责任链模式设计，使用链式调用，不同的lo]]></description><category></category></item><item><title><![CDATA[Object.freeze方法]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/106835220</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/106835220</guid><author>TuoHai_</author><pubDate>Thu, 18 Jun 2020 15:01:47 +0800</pubDate><description><![CDATA[Object.freeze方法是es5中新增加的一个属性描述符，用于锁定一个对象，被锁定后的对象将不可添加或删除属性，对自身已有属性也不可进行修改。
let obj = Object.freeze({name:"aaa"});

obj.age=12;

console.log(obj.age); // undefined

obj.name = "bbb";

console.log(obj.name); // aaa

delete obj.name;

console.log(obj.name); /]]></description><category></category></item><item><title><![CDATA[设计模式之桥接模式]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/106825883</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/106825883</guid><author>TuoHai_</author><pubDate>Thu, 18 Jun 2020 11:06:55 +0800</pubDate><description><![CDATA[桥接模式是指将抽象和实现放在两个不同的类层次中，使它们可以独立地变化。它属于结构型设计模式的一种。桥接模式主要用于解决双维度扩展问题。

应用场景：

1、如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性，避免在两个层次之间建立静态的继承联系，通过桥接模式可以使它们在抽象层建立一个关联关系。
2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统，桥接模式尤为适用。
3、一个类存在两个独立变化的维度，且这两个维度都需要进行扩展。

模拟场景

假设现在有这样一个剧院，每周]]></description><category></category></item><item><title><![CDATA[设计模式之适配器模式]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/106789648</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/106789648</guid><author>TuoHai_</author><pubDate>Tue, 16 Jun 2020 16:17:25 +0800</pubDate><description><![CDATA[设计模式之适配器模式 
适配器模式是一种结构型的设计模式。它的主要作用是作为一个连接器实现不同方法或接口之间的兼容调用。
家里装过空调的朋友都知道，空调作为一种大功率的家用电器，接入线的功率和普通家用电器的接入线是不同的。普通电器的接入线为10A，但是空调的接入线是16A，普通家庭里的安装的插孔大多也都是10A，因此要解决这个问题，我们就需要一个支持输入端为10A，输出端为16A的插排。

// 电源
class ElectricSource {
    constructor(){
        thi]]></description><category></category></item><item><title><![CDATA[Object.defineProperty 方法]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/106666683</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/106666683</guid><author>TuoHai_</author><pubDate>Wed, 10 Jun 2020 15:29:07 +0800</pubDate><description><![CDATA[Object.defineProperty是es5中新增加的属性描述符。在它出现之前你可能会经常有一些疑问，比如for in 循环为何不能遍历出函数的arguments、length、name等属性名，delete window.a 为何返回false, 等你学完这个api，这些现象便都能够得到解释。
Object.defineProperty 一共涉及6个可配置项：
    writable：	是否可重写

    value：  	当前值

    get：    	 读取时内部调用的函数

	set：]]></description><category></category></item><item><title><![CDATA[设计模式之原型模式]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/106623932</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/106623932</guid><author>TuoHai_</author><pubDate>Mon, 08 Jun 2020 17:02:54 +0800</pubDate><description><![CDATA[原型模式是快速创建重复对象的一种最佳模式。 这里所说的原型是我们要创建的实例的原始模型，不是js中某个方法或对象的原型属性。
在javaScript中因为需要渲染各种数据，尤其是在使用基于数据驱动的vue或react等框架进行开发时经常会遇到需要数据拷贝的情况。除此之外，关于前端的数据缓存方法的封装等也常常需要考虑到数据的拷贝，原型模式其实在不知不觉间就被使用了。


class ProtypeMain {
    constructor() {
        this.map = new Map();
]]></description><category></category></item><item><title><![CDATA[设计模式之建造者模式]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/106602264</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/106602264</guid><author>TuoHai_</author><pubDate>Sun, 07 Jun 2020 15:30:55 +0800</pubDate><description><![CDATA[设计模式之建造者模式
什么是建造者模式？
建造者模式是把简单对象构造成复杂对象的一种模式。 它也是一种创建型的设计模式，只不过它的产物一般是一个复杂的对象，而且这个对象在组合构建时是可变的。
什么时候使用建造者模式？
上边说到建造者模式的功能是用来创建复杂对象。如果一个对象是有多个可变的属性组成，且根据场景不同，这些属性的值是可变的，那么如果只靠传参来控制一定是一件非常头疼的事。这个时候就可以考虑使用建造者模式简化创建过程，同时使对象的创建过程变得更可控。
比如说，现在老王有个施工队，这个施工队负责到处给别]]></description><category></category></item><item><title><![CDATA[Spring Boot CLI安装及配置]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/106439297</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/106439297</guid><author>TuoHai_</author><pubDate>Sat, 30 May 2020 12:05:16 +0800</pubDate><description><![CDATA[Spring Boot CLI安装及配置
Spring Boot CLI是一个命令行工具，可用于快速搭建基于Spring的原型。它支持运行Groovy脚本，这也就意味着你可以使用类似Java的语法，但不用写很多的模板代码。
你可以点击这里 进行下载，有很多可供选择的版本，我选择的是目前最新的版本spring-2.3.0.RELEASE
文件下载后可以找一个适当的目录存放，然后配置环境变量。你可以使用命令进行配置，记得修改自己的路径。
set path=D:\softwares\spring-2.3.0.RE]]></description><category></category></item><item><title><![CDATA[10分钟带你学会nginx！]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/106351787</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/106351787</guid><author>TuoHai_</author><pubDate>Tue, 26 May 2020 11:30:25 +0800</pubDate><description><![CDATA[什么是nginx？
Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的一款应用。从2004年发布至今，凭借开源的力量，已经接近成熟与完善。Nginx功能丰富，可作为HTTP服务器，也可作为反向代理服务器，邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
如果你不明白上边在说什么的话也没关系，你可以把它当成一个工具软件，接下来我会告诉你它可以做什么以及怎么使用。
安装
既然是个工具，那]]></description><category></category></item><item><title><![CDATA[设计模式之抽象工厂模式]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/106334777</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/106334777</guid><author>TuoHai_</author><pubDate>Mon, 25 May 2020 15:49:12 +0800</pubDate><description><![CDATA[设计模式之抽象工厂模式简介总结
简介
抽象工厂是比工厂模式更高端的一种创建型设计模式，他主要用来创建工厂。
比如说老王之前开了一家文具厂，可是生意越做越大，老王现在还想办服装厂，玩具厂，食品厂等等。老王财大气粗一口气要办十几个跨行业的厂房，但是一个人毕竟精力有限，最好的办法是在自己和下属的厂房之间设立一个部门，专门负责新厂房的修建和新业务的扩展。这样老王如果想了解厂房的情况只需要问责这个部门就可以了。
看下代码实现：
// 父类 文具 
class Stationery {
    constructor(]]></description><category></category></item><item><title><![CDATA[设计模式之工厂模式]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/106314018</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/106314018</guid><author>TuoHai_</author><pubDate>Sun, 24 May 2020 14:20:46 +0800</pubDate><description><![CDATA[设计模式之工厂模式简介优缺点总结
简介
工厂模式是设计模式中一种最常用的创建型设计模式。我们之所以称其为创建型模式是因为它主要用来创建新的对象。在实际开发过程中你常常会遇到需要创建对象的情况，这些对象可能大同小异，每次单独创建会增加代码量且不易于后期维护，所以就可以将这一部分封装为公共方法，命名为工厂方法。
举个例子: 老王是一家文具厂的厂长，文具厂里可以生产多种文具，当零售商到文具厂批发货物时会指定要购买哪种文具。

// 父类文具
class Stationery {
    getType(){
  ]]></description><category></category></item><item><title><![CDATA[JavaScript原型和面向对象]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/81143560</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/81143560</guid><author>TuoHai_</author><pubDate>Sat, 21 Jul 2018 12:50:40 +0800</pubDate><description><![CDATA[原型（prototype）的来源：

  虽然JavaScript和Java并没什么关系，但是JavaScript在开始创建的时候想要模仿Java 通过new 操作符实现对一些方法和属性的共享。但是在es6 之前JavaScript并没有真正类 （class）的概念，所以JavaScript借鉴了其他语言（self , io,  lua等）的原型机制。 简单点说就是在JavaScript中每个函数...]]></description><category></category></item><item><title><![CDATA[设计模式之单例模式]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/80942668</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/80942668</guid><author>TuoHai_</author><pubDate>Fri, 06 Jul 2018 16:12:53 +0800</pubDate><description><![CDATA[  单例模式又被称为单体模式，它是一种非常基本但使用频率很高的设计模式。它的基本设计思想是将代码组织为一个逻辑单元，这个逻辑单元中的代码只能通过单一的变量进行访问。通俗点说就是一个对象只能被实例化一次。由于它确保了访问入口的唯一，所以可以保证所有的代码使用到相同的全局资源。

  基本的单例模式

  最基本的单例模式实际上就是一个对象字面量，当然，你也可以称它为一个命名空间。



var si...]]></description><category></category></item><item><title><![CDATA[前端模块化]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/80839773</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/80839773</guid><author>TuoHai_</author><pubDate>Thu, 28 Jun 2018 10:46:22 +0800</pubDate><description><![CDATA[  对代码进行模块化是项目开发中重要的技术类型，它可以对复杂的功能进行解耦，可以灵活复用和关联各模块功能。随着这些年前端的发展，模块化也成了前端开发必不可少的部分。

  目前，前端比较流行的几种定义模块化的规范分别是: AMD 、CommonJS、ES6 module ,它们都被webpack支持。

  AMD规范

  AMD的全称为 Asynchronous Module Definiti...]]></description><category></category></item><item><title><![CDATA[你不知道的JavaScript数组方法]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/80820243</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/80820243</guid><author>TuoHai_</author><pubDate>Tue, 26 Jun 2018 20:06:15 +0800</pubDate><description><![CDATA[  在JavaScript中数组是使用频率最高的数据结构之一。为了方便我们的开发和使用,ECMA委员会为我们修订和扩展了各种数组方法。这些方法有些比较冷门，有些却非常实用。下面为大家介绍一些你平时可能运用比较少的数组方法。

先介绍几个大家比较熟悉的方法:



sort()

  sort方法用于对数组元素进行排序,它接受传入一个函数，函数的两个参数代表后一个元素与前一个元素，函数的返回值为比较...]]></description><category></category></item><item><title><![CDATA[自动化构建工具gulp入门（三）]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/80800181</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/80800181</guid><author>TuoHai_</author><pubDate>Mon, 25 Jun 2018 12:07:47 +0800</pubDate><description><![CDATA[  相信在看过前两篇文章以后你已经对gulp有了比较深入的了解。但是，虽然开发者们已经为gulp官网贡献了丰富多样的gulp插件，但在实际开发中现有的插件也许并不能完美的满足我们的需求。所有学会自己开发gulp插件也是我们深入掌握gulp使用的必修课程。

  当然，我们知道gulp是基于nodeJs流的自动化工具，这意味着要想独立开发gulp的插件我们需要有一定的nodejs基础。如果你之前并不...]]></description><category></category></item><item><title><![CDATA[自动化构建工具gulp入门（二）]]></title><link>https://blog.youkuaiyun.com/TuoHai_/article/details/80703818</link><guid>https://blog.youkuaiyun.com/TuoHai_/article/details/80703818</guid><author>TuoHai_</author><pubDate>Fri, 15 Jun 2018 12:27:49 +0800</pubDate><description><![CDATA[  上一篇文章中和大家分享了gulp的一些基本概念和使用方法，但实际开发中gulp需要依赖其丰富的插件来发挥它的能力。

  gulp官网中为我们提供了丰富的插件系统可以协助我们进行各种开发工作。但由于其插件数量实在太多，多达数千个，所以我们不可能系统的学习每个插件。在此跟大家一起分享一些常用插件的使用，如果你有更多的学习或开发使用诉求，可以访问gulp的插件官网学习更多插件的使用。

插件官网：...]]></description><category></category></item></channel></rss>