<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[tpc724的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/tpc724</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; tpc724]]></copyright><item><title><![CDATA[工厂模式和抽象工厂模式]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/106987562</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/106987562</guid><author>tpc724</author><pubDate>Thu, 09 Jul 2020 19:44:26 +0800</pubDate><description><![CDATA[1、工厂模式
当client不知道要创建哪一个具体类的实例，或者不想在client代码中指明要具体创建的实例；换句话说就是计划在不同条件下创建不同的实例。在这种情况下，适合使用个工厂模式。
工厂模式可以视作是一个虚拟的构造器，主要思路是定义一个用于创建对象的接口，让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
工厂模式的大致框架如下：（其中不同的Concrete为不同的构造方法，Product为具体构造的实例）

//常规情况下，client直接创建实例对象
Product p=new P]]></description><category></category></item><item><title><![CDATA[代理模式和适配器模式]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/107018231</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/107018231</guid><author>tpc724</author><pubDate>Thu, 09 Jul 2020 19:44:16 +0800</pubDate><description><![CDATA[1、代理模式（Proxy）
代理通常用于网络访问中，允许客户端通过代理与另一个网络终端实现非直接的连接。代理模式的思想就是来自于网络代理，创建一个类来代表现有的一个类，以便向外界提供功能接口，也可以认为是现有类的一个访问层。通常在直接访问类比较麻烦或代价较高的情况下实行。
代理模式的结构如下

1.1 实例

问题背景


...]]></description><category></category></item><item><title><![CDATA[观察者模式和访问者模式]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/107026900</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/107026900</guid><author>tpc724</author><pubDate>Thu, 09 Jul 2020 19:44:04 +0800</pubDate><description><![CDATA[1、观察者模式（Observer）

]]></description><category></category></item><item><title><![CDATA[装饰模式和外观模式]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/107061617</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/107061617</guid><author>tpc724</author><pubDate>Thu, 09 Jul 2020 19:43:52 +0800</pubDate><description><![CDATA[装饰模式（Decorator）
当我们扩展一个类时，通常使用继承子类的方式，但当扩展的功能比较多的时候，子类会变得比较臃肿，在这种情况下，除了使用delegation以外，还可以使用装饰模式。装饰模式形象地理解就是往类上套上包装进行装饰，也就是说在不改变类结构的前提下，向现有的对象提供新的功能，因此这是一种结构性模式。

装饰模式的应用场景：当需要给一个现有类添加附加职责，但该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类；当对象的功能要求可以动态地添加，也可以再动态地撤销时；
Java中装饰模式]]></description><category></category></item><item><title><![CDATA[策略模式和模板模式]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/107082114</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/107082114</guid><author>tpc724</author><pubDate>Thu, 09 Jul 2020 19:43:35 +0800</pubDate><description><![CDATA[1、策略模式（Strategy）
对于一个类来说，如果在不同的情况下实现的算法不同，可以采用策略模式。

]]></description><category></category></item><item><title><![CDATA[状态模式和备忘录模式]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/106884387</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/106884387</guid><author>tpc724</author><pubDate>Sun, 21 Jun 2020 19:52:28 +0800</pubDate><description><![CDATA[1 状态模式（State）
状态模式把对象的行为包装在不同的状态对象里，每一个状态对象都是一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候，其行为也随之改变。和状态模式较相似的操作就是if…else if…else语句，同样都代表了不同条件下的对象行为，但是当条件较多时，或者状态改变较为复杂时，使用状态模式是更好的选择。
1.1 状态模式的结构
状态模式所涉及到的类包括三种

Context；客户端中使用某一具体状态的实例。
State；状态接口，定义每个状态所使用的方法。
Con]]></description><category></category></item><item><title><![CDATA[Java日志Log4j 2简介]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/106871585</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/106871585</guid><author>tpc724</author><pubDate>Sat, 20 Jun 2020 17:35:31 +0800</pubDate><description><![CDATA[1 Java常用的日志框架
以下是五种常用的日志框架，包含官网链接

 JDK logging
 Apache Log4j 2
Apache Commons-logging
SLF4J
syslog-ng

2 Log4j日志的level

ALL；打开所有等级的日志
Trace；追踪每一条执行语句
Debug；细粒度下为调试程序
Info；粗粒度为反映程序运行主要过程
Warn；警告信息
Error；错误信息
Fatal；导致程序退出的重大错误信息
OFF；关闭所有日志信息
All----OFF日志等级从]]></description><category></category></item><item><title><![CDATA[断言与防御式编程]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/106852645</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/106852645</guid><author>tpc724</author><pubDate>Fri, 19 Jun 2020 14:41:05 +0800</pubDate><description><![CDATA[1 断言
1.1 断言的含义

断言：在开发阶段的代码中嵌入，检验某些条件是否成立，如果成立，程序运行正常，否则会抛出AssertionError，程序运行终止

断言的使用主要是测试代码的正确性，可以在一定程度上保证代码质量，而且不会影响运行时性能（在实际使用时，assertion都会被disabled）。当出现AssertionError则说明与某些rep与预期出现偏差 ，和抛出异常类似，同样可以在发生错误时输出错误信息。
例：
assert x&gt;=0;
assert x&gt;=0 : "x" ]]></description><category></category></item><item><title><![CDATA[健壮性（Robustness）]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/106819441</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/106819441</guid><author>tpc724</author><pubDate>Thu, 18 Jun 2020 14:33:14 +0800</pubDate><description><![CDATA[1、健壮性与正确性
健壮性：系统在不正常输入情况下仍能表现正常的程度。

处理未期望的行为和错误终止；
即使终止执行，也要准确/无歧义地向用户展示错误信息
错误信息有助于debug

正确性：程序按照spec加以执行的能力，是最重要的质量指标
正确性 vs 健壮性

正确性，永不给用户错误的结果；健壮性，尽可能保持软件运行而不是总是退出
正确性倾向于直接报错，健壮性倾向于容错
对外的接口，倾向于健壮性；对内的实现，倾向于正确性

2、错误和异常处理
在Java的Throwable类中有两个子类：Except]]></description><category></category></item><item><title><![CDATA[线程安全及其策略]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/106732079</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/106732079</guid><author>tpc724</author><pubDate>Tue, 16 Jun 2020 15:06:58 +0800</pubDate><description><![CDATA[1 线程安全
之前介绍了线程之间的交错与竞争，线程之间的竞争条件是作用于同一个mutable数据上的多个线程，彼此之间存在对该数据的访问竞争并导致interleaving，导致post-condition可能被违反，这就导致了线程不安全。
线程安全：ADT或方法在多线程中要执行正确，不需要额外的协调。共有四种线程安全的策略，分别为限制数据共享（Confinement），共享不可变数据（Immutability），共享线程安全的可变数据（Thread data type）和同步机制（Synchronizati]]></description><category></category></item><item><title><![CDATA[并行和分布式编程简介(Concurrent and Distributed Programming)]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/106708535</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/106708535</guid><author>tpc724</author><pubDate>Sat, 13 Jun 2020 14:34:18 +0800</pubDate><description><![CDATA[1、并发（Concurrency）
1.1 并发的基本概念
并发这一部分的内容在CSAPP中有详细的介绍，在软件构造课程多线程这一节简单介绍了这部分内容，可以作为一种复习。
并发，通俗的解释就是多个计算在同一时间同时发生。由于摩尔定律的实效，且为了充分利用多核和多处理器，并发使用越来越频繁。应用的场景主要是网络上的多台计算机、一台计算机上的多台应用、一个CPU的多核处理器。
并发的两种models：共享内存，在内存中读写共享数据；消息传递，通过channel交换消息。

共享内存：两个处理器共享内存；同一台]]></description><category></category></item><item><title><![CDATA[算法笔记：分治法基础]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/104639037</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/104639037</guid><author>tpc724</author><pubDate>Thu, 05 Mar 2020 20:12:48 +0800</pubDate><description><![CDATA[1、最大子数组问题
问题：在原数组A[1…n]中找到一个连续的子数组A[i…j]，使该子数组中所有元素之和最大。
算法基本思想：将原数组分成两部分，连续的子数组所处的位置只有三种情况：在数组左半部分，mid左侧；在数组右半部分，mid右侧；跨越中点，即既在mid左侧，又在mid右侧。分别计算这三种情况子数组的最大元素和，取三种情况中的最大值，这种情况下的子数组即为最大子数组。计算子数组的元素和通过...]]></description><category></category></item><item><title><![CDATA[哈希表的简单应用（一）：LeetCode 205 & 290]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/104444194</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/104444194</guid><author>tpc724</author><pubDate>Sat, 22 Feb 2020 15:45:10 +0800</pubDate><description><![CDATA[LeetCode 205：同构字符串

给定两个字符串 s 和 t，判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ，那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换，同时保留字符的顺序。两个字符不能映射到同一个字符上，但字符可以映射自己本身。

示例 ：

输入: s = “egg”, t = “add”
输出: true
输入: s = “foo”, t = “b...]]></description><category></category></item><item><title><![CDATA[位运算的简单应用]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/104414497</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/104414497</guid><author>tpc724</author><pubDate>Fri, 21 Feb 2020 15:30:10 +0800</pubDate><description><![CDATA[概述
在学习程序语言时，并没有感受到位运算的用处，只知道左移右移可以代替乘法除法且效率较高。学习完CASPP后，发现其实位运算还是比较重要的，它更贴近于底层，最近写的一些题目中，发现位运算有许多意想不到的作用，可以巧解一些题，在这里做一下总结和梳理。
位运算符号

&amp; :  与运算——按位与，两个位为1则与运算之后为1，其余情况为0
|  ：或运算——按位或，两个位为0则或运算之后为0，其...]]></description><category></category></item><item><title><![CDATA[渐进符号]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/104261760</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/104261760</guid><author>tpc724</author><pubDate>Tue, 11 Feb 2020 17:18:03 +0800</pubDate><description><![CDATA[渐进符号
1、渐进紧确界记号：Θ

Θ的数学含义：
对一个给定的函数g(n)，用Θ(g(n))来表示以下函数的集合
Θ(g(n))={  f(n)：存在正常量c1、c2和n0，使得对所有n ≥ n0n_{0}n0​，有0≤  c1g(n)  ≤  f(n)  ≤  c2g(n)  }
Θ(g(n))要求每个成员 f(n)∈Θ(g(n)) 均渐进非负，即当n足够大时 f(n) 非负，渐进正函数就是对...]]></description><category></category></item><item><title><![CDATA[CSAPP 程序人生大作业]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/103697357</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/103697357</guid><author>tpc724</author><pubDate>Wed, 25 Dec 2019 13:48:09 +0800</pubDate><description><![CDATA[计算机系统大作业
程序人生-Hello’s P2P
学　　   号  1180300510
学       生  唐鹏程
GitHub 链接：https://github.com/star-victory/hello
文章目录摘要第一章 概述1.1 hello简介1.2 环境与工具1.3 中间结果1.4 文章小结第二章 预处理2.1 预处理的概念与作用2.2 在Ubuntu下预处理的命令2.3 h...]]></description><category></category></item><item><title><![CDATA[C++下的计数、选择、冒泡、插入排序]]></title><link>https://blog.youkuaiyun.com/tpc724/article/details/100173820</link><guid>https://blog.youkuaiyun.com/tpc724/article/details/100173820</guid><author>tpc724</author><pubDate>Sat, 31 Aug 2019 19:53:21 +0800</pubDate><description><![CDATA[近期开始学习数据结构与算法（以C++为例），而排序是其中较为基础的内容，在这里对排序进行回顾和复习。这里以一维整数数组举例进行排序。
首先是计数排序  。首先介绍名次的概念，一个数在一个序列中的名次是指所有比这个数小的元素个数和在它左边出现的与它相同的元素个数。例如，数组a=[5,8,4,3,7]的名次为b=[3,1,4,5,2]。计算数组a各元素的名次函数rank如下。对于每一个元素a[i],其...]]></description><category></category></item></channel></rss>