mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-11-15 21:53:50 +08:00
u
This commit is contained in:
@@ -25,13 +25,7 @@
|
||||
<meta name="generator" content="Hexo 4.2.0">
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
|
||||
<div class="book-container">
|
||||
|
||||
<div class="book-sidebar">
|
||||
@@ -55,373 +49,190 @@
|
||||
<li><a href="/" class="current-tab">首页</a></li>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
<ul class="uncollapsible">
|
||||
|
||||
<li><a href="../">上一级</a></li>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
<ul class="uncollapsible">
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/00 生活中的设计模式:启程之前,请不要错过我.md.html">00 生活中的设计模式:启程之前,请不要错过我.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/01 监听模式:坑爹的热水器.md.html">01 监听模式:坑爹的热水器.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/02 适配模式:身高不够鞋来凑.md.html">02 适配模式:身高不够鞋来凑.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/03 状态模式:人与水的三态.md.html">03 状态模式:人与水的三态.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/04 单例模式:你是我生命的唯一.md.html">04 单例模式:你是我生命的唯一.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/05 职责模式:我的假条去哪了.md.html">05 职责模式:我的假条去哪了.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/06 中介模式:找房子问中介.md.html">06 中介模式:找房子问中介.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/07 代理模式:帮我拿一下快递.md.html">07 代理模式:帮我拿一下快递.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/08 装饰模式:你想怎么穿就怎么穿.md.html">08 装饰模式:你想怎么穿就怎么穿.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/09 工厂模式:你要拿铁还是摩卡.md.html">09 工厂模式:你要拿铁还是摩卡.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/10 迭代模式:下一个就是你了.md.html">10 迭代模式:下一个就是你了.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/11 组合模式:自己组装电脑.md.html">11 组合模式:自己组装电脑.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/12 构建模式:想要车还是庄园.md.html">12 构建模式:想要车还是庄园.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/13 克隆模式:给你一个分身术.md.html">13 克隆模式:给你一个分身术.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/14 策略模式:怎么来不重要,人到就行.md.html">14 策略模式:怎么来不重要,人到就行.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/15 命令模式:大闸蟹,走起!.md.html">15 命令模式:大闸蟹,走起!.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
<a class="current-tab" href="/专栏/白话设计模式 28 讲(完)/16 备忘模式:好记性不如烂笔头.md.html">16 备忘模式:好记性不如烂笔头.md.html</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/17 享元模式:颜料很贵必须充分利用.md.html">17 享元模式:颜料很贵必须充分利用.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/18 外观模式:学妹别慌,学长帮你.md.html">18 外观模式:学妹别慌,学长帮你.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/19 访问模式:一千个读者一千个哈姆雷特.md.html">19 访问模式:一千个读者一千个哈姆雷特.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/20 生活中的设计模式:与经典设计模式的不解渊源.md.html">20 生活中的设计模式:与经典设计模式的不解渊源.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/21 生活中的设计模式:那些未完待续的设计模式.md.html">21 生活中的设计模式:那些未完待续的设计模式.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/22 深入解读过滤器模式:制作一杯鲜纯细腻的豆浆.md.html">22 深入解读过滤器模式:制作一杯鲜纯细腻的豆浆.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/23 深入解读对象池技术:共享让生活更便捷.md.html">23 深入解读对象池技术:共享让生活更便捷.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/24 深入解读回调机制:把你技能亮出来.md.html">24 深入解读回调机制:把你技能亮出来.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/25 谈谈我对设计模式的理解.md.html">25 谈谈我对设计模式的理解.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/26 谈谈我对设计原则的思考.md.html">26 谈谈我对设计原则的思考.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/27 谈谈我对项目重构的看法.md.html">27 谈谈我对项目重构的看法.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
|
||||
|
||||
<div class="sidebar-toggle-inner"></div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
function add_inner() {
|
||||
@@ -431,9 +242,6 @@
|
||||
inner.classList.add('show')
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function remove_inner() {
|
||||
|
||||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||||
@@ -441,9 +249,6 @@
|
||||
inner.classList.remove('show')
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function sidebar_toggle() {
|
||||
|
||||
let sidebar_toggle = document.querySelector('.sidebar-toggle')
|
||||
@@ -473,9 +278,6 @@
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function open_sidebar() {
|
||||
|
||||
let sidebar = document.querySelector('.book-sidebar')
|
||||
@@ -499,13 +301,7 @@ function hide_canvas() {
|
||||
overlay.classList.remove('show')
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
<div class="off-canvas-content">
|
||||
|
||||
<div class="columns">
|
||||
@@ -567,31 +363,19 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class Engineer:
|
||||
|
||||
"工程师"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
self.__workItems = []
|
||||
|
||||
|
||||
|
||||
def addWorkItem(self, item):
|
||||
|
||||
self.__workItems.append(item)
|
||||
|
||||
|
||||
|
||||
def forget(self):
|
||||
|
||||
self.__workItems.clear()
|
||||
|
||||
print(self.__name + "工作太忙了,都忘记要做什么了!")
|
||||
|
||||
|
||||
|
||||
def writeTodoList(self):
|
||||
|
||||
todoList = TodoList()
|
||||
@@ -601,17 +385,11 @@ function hide_canvas() {
|
||||
todoList.writeWorkItem(item)
|
||||
|
||||
return todoList
|
||||
|
||||
|
||||
|
||||
def retrospect(self, todoList):
|
||||
|
||||
self.__workItems = todoList.getWorkItems()
|
||||
|
||||
print(self.__name + "想起要做什么了!")
|
||||
|
||||
|
||||
|
||||
def showWorkItem(self):
|
||||
|
||||
if(len(self.__workItems)):
|
||||
@@ -625,57 +403,30 @@ function hide_canvas() {
|
||||
else:
|
||||
|
||||
print(self.__name + "暂无工作项!")
|
||||
|
||||
|
||||
|
||||
class TodoList:
|
||||
|
||||
"工作项"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__workItems = []
|
||||
|
||||
|
||||
|
||||
def writeWorkItem(self, item):
|
||||
|
||||
self.__workItems.append(item)
|
||||
|
||||
|
||||
|
||||
def getWorkItems(self):
|
||||
|
||||
return self.__workItems
|
||||
|
||||
|
||||
|
||||
class TodoListCaretaker:
|
||||
|
||||
"TodoList管理类"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__todoList = None
|
||||
|
||||
|
||||
|
||||
def setTodoList(self, todoList):
|
||||
|
||||
self.__todoList = todoList
|
||||
|
||||
|
||||
|
||||
def getTodoList(self):
|
||||
|
||||
return self.__todoList
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -695,25 +446,16 @@ class TodoListCaretaker:
|
||||
caretaker = TodoListCaretaker()
|
||||
|
||||
caretaker.setTodoList(tony.writeTodoList())
|
||||
|
||||
|
||||
|
||||
print()
|
||||
|
||||
tony.forget()
|
||||
|
||||
tony.showWorkItem()
|
||||
|
||||
|
||||
|
||||
print()
|
||||
|
||||
tony.retrospect(caretaker.getTodoList())
|
||||
|
||||
tony.showWorkItem()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -725,15 +467,9 @@ class TodoListCaretaker:
|
||||
2. 完成PDF的解析;
|
||||
|
||||
3. 在阅读器中显示PDF第一页的内容;
|
||||
|
||||
|
||||
|
||||
Tony工作太忙了,都忘记要做什么了!
|
||||
|
||||
Tony暂无工作项!
|
||||
|
||||
|
||||
|
||||
Tony想起要做什么了!
|
||||
|
||||
Tony的工作项:
|
||||
@@ -743,9 +479,6 @@ Tony的工作项:
|
||||
2. 完成PDF的解析;
|
||||
|
||||
3. 在阅读器中显示PDF第一页的内容;
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考备忘模式</h3>
|
||||
@@ -783,61 +516,34 @@ Tony的工作项:
|
||||
<p>因为升级版的备忘录模式比较通用,我们可以抽象出升级版备忘录模式的代码框架模型。</p>
|
||||
|
||||
<pre><code class="language-python">from copy import deepcopy
|
||||
|
||||
|
||||
|
||||
class Memento:
|
||||
|
||||
"备忘录"
|
||||
|
||||
|
||||
|
||||
def setAttribute(self, dict):
|
||||
|
||||
"深度拷贝字典dict中的所有属性"
|
||||
|
||||
self.__dict__ = deepcopy(dict)
|
||||
|
||||
|
||||
|
||||
def getAttribute(self):
|
||||
|
||||
"获取属性字典"
|
||||
|
||||
return self.__dict__
|
||||
|
||||
|
||||
|
||||
class Caretaker:
|
||||
|
||||
"备忘录管理类"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self._mementos = {}
|
||||
|
||||
|
||||
|
||||
def addMemento(self, name, memento):
|
||||
|
||||
self._mementos[name] = memento
|
||||
|
||||
|
||||
|
||||
def getMemento(self, name):
|
||||
|
||||
return self._mementos[name]
|
||||
|
||||
|
||||
|
||||
class Originator:
|
||||
|
||||
"备份发起人"
|
||||
|
||||
|
||||
|
||||
def createMemento(self):
|
||||
|
||||
memento = Memento()
|
||||
@@ -845,15 +551,9 @@ class Originator:
|
||||
memento.setAttribute(self.__dict__)
|
||||
|
||||
return memento
|
||||
|
||||
|
||||
|
||||
def restoreFromMemento(self, memento):
|
||||
|
||||
self.__dict__.update(memento.getAttribute())
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h4>模型说明</h4>
|
||||
@@ -903,21 +603,12 @@ class Originator:
|
||||
# Authoer: Spencer.Luo
|
||||
|
||||
# Date: 5/20/2018
|
||||
|
||||
|
||||
|
||||
# 引入升级版备忘录模式关键类
|
||||
|
||||
from pattern.Memento import Originator, Caretaker, Memento
|
||||
|
||||
|
||||
|
||||
class TerminalCmd(Originator):
|
||||
|
||||
"终端命令"
|
||||
|
||||
|
||||
|
||||
def __init__(self, text):
|
||||
|
||||
self.__cmdName = ""
|
||||
@@ -925,9 +616,6 @@ class TerminalCmd(Originator):
|
||||
self.__cmdArgs = []
|
||||
|
||||
self.parseCmd(text)
|
||||
|
||||
|
||||
|
||||
def parseCmd(self, text):
|
||||
|
||||
"从字符串中解析命令"
|
||||
@@ -939,31 +627,19 @@ class TerminalCmd(Originator):
|
||||
if(len(subStrs) > 0):
|
||||
|
||||
self.__cmdName = subStrs[0]
|
||||
|
||||
|
||||
|
||||
# 获取第一个字段之后的所有字符作为命令的参数
|
||||
|
||||
if (len(subStrs) > 1):
|
||||
|
||||
self.__cmdArgs = subStrs[1:]
|
||||
|
||||
|
||||
|
||||
def getArgumentsFromString(self, str, splitFlag):
|
||||
|
||||
"通过splitFlag进行分割,获得参数数组."
|
||||
|
||||
|
||||
|
||||
if (splitFlag == ""):
|
||||
|
||||
print("splitFlag is empty!")
|
||||
|
||||
return ""
|
||||
|
||||
|
||||
|
||||
data = str.split(splitFlag)
|
||||
|
||||
result = []
|
||||
@@ -975,25 +651,13 @@ class TerminalCmd(Originator):
|
||||
if (item != ""):
|
||||
|
||||
result.append(item)
|
||||
|
||||
|
||||
|
||||
return result;
|
||||
|
||||
|
||||
|
||||
def showCmd(self):
|
||||
|
||||
print(self.__cmdName, self.__cmdArgs)
|
||||
|
||||
|
||||
|
||||
class TerminalCaretaker(Caretaker):
|
||||
|
||||
"终端的备忘录管理类"
|
||||
|
||||
|
||||
|
||||
def showHistoryCmds(self):
|
||||
|
||||
"显示历史命令"
|
||||
@@ -1013,9 +677,6 @@ class TerminalCaretaker(Caretaker):
|
||||
value = obj._TerminalCmd__cmdArgs
|
||||
|
||||
print("第" + str(key) + "条命令: " + str(name) + " " + str(value))
|
||||
|
||||
|
||||
|
||||
def testTerminal():
|
||||
|
||||
cmdIdx = 0
|
||||
@@ -1057,13 +718,7 @@ def testTerminal():
|
||||
caretaker.addMemento(cmdIdx, curCmd.createMemento())
|
||||
|
||||
cmdIdx +=1
|
||||
|
||||
|
||||
|
||||
testTerminal()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p><strong>输出结果:</strong></p>
|
||||
@@ -1101,9 +756,6 @@ testTerminal()
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1111,9 +763,6 @@ testTerminal()
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1129,17 +778,11 @@ testTerminal()
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1165,9 +808,6 @@ testTerminal()
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1179,9 +819,6 @@ testTerminal()
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1199,12 +836,6 @@ testTerminal()
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user