mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2026-05-11 04:04:35 +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 class="current-tab" 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 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">
|
||||
@@ -673,17 +469,11 @@ function hide_canvas() {
|
||||
<p>个人觉得,在所有的高级计算机语言中,Python 是最接近人类自然语言的。Python 的语法、风格都与英文的书写习惯非常接近,Python 的这种风格被称为 Pythonic,如条件表达式,在 Java 和 C++ 中是这样的:</p>
|
||||
|
||||
<pre><code class="language-java">int min = x < y ? x : y
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>而 Python 是这样的:</p>
|
||||
|
||||
<pre><code class="language-python">min = x if x < y else y
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>有没有觉得第二种方式更接近人类的自然思维?</p>
|
||||
@@ -731,9 +521,6 @@ print("name:", name)
|
||||
age = name
|
||||
|
||||
print("age:", age)
|
||||
|
||||
|
||||
|
||||
a = b = c = 5
|
||||
|
||||
# a,b,c三个变量指向相同的内存空间,具有相同的值
|
||||
@@ -741,9 +528,6 @@ a = b = c = 5
|
||||
print("a:", a, "b:", b, "c:", c)
|
||||
|
||||
print("id(a):", id(a), "id(b):", id(b), "id(c):", id(c))
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>结果:</p>
|
||||
@@ -759,9 +543,6 @@ age: Tony
|
||||
a: 5 b: 5 c: 5
|
||||
|
||||
id(a): 1457772400 id(b): 1457772400 id(c): 1457772400
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h4>常用容器</h4>
|
||||
@@ -805,9 +586,6 @@ print(list) # 输出完整列表
|
||||
list.append("added data")
|
||||
|
||||
print(list) # 输出增加后的列表
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>结果:</p>
|
||||
@@ -827,9 +605,6 @@ Thomson
|
||||
['Thomson', 100, 12.58, 'Sunny', 180.2]
|
||||
|
||||
['Thomson', 100, 12.58, 'Sunny', 180.2, 'added data']
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h5>Tuple(元组)</h5>
|
||||
@@ -855,9 +630,6 @@ print(tinytuple * 2) # 输出元组两次
|
||||
print(tuple + tinytuple)# 打印组合的元组
|
||||
|
||||
# tuple[1] = 100 # 不能修改元组内的元素
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>结果:</p>
|
||||
@@ -873,9 +645,6 @@ Thomson
|
||||
(123, 'Tony', 123, 'Tony')
|
||||
|
||||
('Thomson', 78, 12.58, 'Sunny', 180.2, 123, 'Tony')
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h5>Dictionary(字典)</h5>
|
||||
@@ -903,9 +672,6 @@ print(tinydict) # 输出完整的字典
|
||||
print(tinydict.keys()) # 输出所有键
|
||||
|
||||
print(tinydict.values())# 输出所有值
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>结果:</p>
|
||||
@@ -919,9 +685,6 @@ This is two
|
||||
dict_keys(['name', 'age', 'height'])
|
||||
|
||||
dict_values(['Tony', 24, 177])
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h4>类的定义</h4>
|
||||
@@ -933,9 +696,6 @@ dict_values(['Tony', 24, 177])
|
||||
'类的帮助信息' #类文档字符串
|
||||
|
||||
class_suite #类体
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>类的帮助信息可以通过 ClassName.<code>__doc__</code> 查看,class_suite 由类成员,方法,数据属性组成。如:</p>
|
||||
@@ -943,21 +703,12 @@ dict_values(['Tony', 24, 177])
|
||||
<pre><code>class Test:
|
||||
|
||||
"这是一个测试类"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__ivalue = 5
|
||||
|
||||
|
||||
|
||||
def getvalue(self):
|
||||
|
||||
return self.__ivalue
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>其中,<code>__init__</code> 为初始化函数,相当于构造函数。</p>
|
||||
@@ -981,9 +732,6 @@ dict_values(['Tony', 24, 177])
|
||||
<pre><code>class 派生类名(基类名):
|
||||
|
||||
类体
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>Python 中继承中的一些特点:</p>
|
||||
@@ -1095,9 +843,6 @@ dict_values(['Tony', 24, 177])
|
||||
<pre><code class="language-java">class Person {
|
||||
|
||||
public static int visited;
|
||||
|
||||
|
||||
|
||||
Person(String name, int age, float height) {
|
||||
|
||||
this.name = name;
|
||||
@@ -1107,25 +852,16 @@ dict_values(['Tony', 24, 177])
|
||||
this.height = height;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public String getName() {
|
||||
|
||||
return name;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public int getAge() {
|
||||
|
||||
return age;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void showInfo() {
|
||||
|
||||
System.out.println("name:" + name);
|
||||
@@ -1139,9 +875,6 @@ dict_values(['Tony', 24, 177])
|
||||
Person.visited ++;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private String name;
|
||||
|
||||
protected int age;
|
||||
@@ -1149,37 +882,22 @@ dict_values(['Tony', 24, 177])
|
||||
public float height;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
class Teacher extends Person {
|
||||
|
||||
|
||||
|
||||
Teacher(String name, int age, float height) {
|
||||
|
||||
super(name, age, height);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public String getTitle() {
|
||||
|
||||
return title;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void setTitle(String title) {
|
||||
|
||||
this.title = title;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void showInfo() {
|
||||
|
||||
System.out.println("title:" + title);
|
||||
@@ -1187,13 +905,7 @@ class Teacher extends Person {
|
||||
super.showInfo();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private String title;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class Test {
|
||||
@@ -1215,9 +927,6 @@ public class Test {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>对应的 Python 代码:</p>
|
||||
@@ -1227,9 +936,6 @@ public class Test {
|
||||
"人"
|
||||
|
||||
visited = 0
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, age, height):
|
||||
|
||||
self.__name = name
|
||||
@@ -1237,21 +943,12 @@ public class Test {
|
||||
self._age = age
|
||||
|
||||
self.height = height
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def getAge(self):
|
||||
|
||||
return self._age
|
||||
|
||||
|
||||
|
||||
def showInfo(self):
|
||||
|
||||
print("name:", self.__name)
|
||||
@@ -1263,43 +960,25 @@ public class Test {
|
||||
print("visited:", self.visited)
|
||||
|
||||
Person.visited = Person.visited +1
|
||||
|
||||
|
||||
|
||||
class Teacher(Person):
|
||||
|
||||
"老师"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, age, height):
|
||||
|
||||
super().__init__(name, age, height)
|
||||
|
||||
self.__title = None
|
||||
|
||||
|
||||
|
||||
def getTitle(self):
|
||||
|
||||
return self.__title
|
||||
|
||||
|
||||
|
||||
def setTitle(self, title):
|
||||
|
||||
self.__title = title
|
||||
|
||||
|
||||
|
||||
def showInfo(self):
|
||||
|
||||
print("title:", self.__title)
|
||||
|
||||
super().showInfo()
|
||||
|
||||
|
||||
|
||||
def testPerson():
|
||||
|
||||
"测试方法"
|
||||
@@ -1309,21 +988,12 @@ def testPerson():
|
||||
tony.showInfo()
|
||||
|
||||
print();
|
||||
|
||||
|
||||
|
||||
jenny = Teacher("Jenny", 34, 1.68);
|
||||
|
||||
jenny.setTitle("教授");
|
||||
|
||||
jenny.showInfo();
|
||||
|
||||
|
||||
|
||||
testPerson()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>自己测试一下,会发现结果是一样的:</p>
|
||||
@@ -1335,9 +1005,6 @@ age: 25
|
||||
height: 1.77
|
||||
|
||||
visited: 0
|
||||
|
||||
|
||||
|
||||
title: 教授
|
||||
|
||||
name: Jenny
|
||||
@@ -1347,9 +1014,6 @@ age: 34
|
||||
height: 1.68
|
||||
|
||||
visited: 1
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>重要说明</h3>
|
||||
@@ -1377,9 +1041,6 @@ visited: 1
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1387,9 +1048,6 @@ visited: 1
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1405,17 +1063,11 @@ visited: 1
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1441,9 +1093,6 @@ visited: 1
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1455,9 +1104,6 @@ visited: 1
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1475,12 +1121,6 @@ visited: 1
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 class="current-tab" 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 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">
|
||||
@@ -565,23 +361,14 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class WaterHeater:
|
||||
|
||||
"热水器:战胜寒冬的有利武器"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__observers = []
|
||||
|
||||
self.__temperature = 25
|
||||
|
||||
|
||||
|
||||
def getTemperature(self):
|
||||
|
||||
return self.__temperature
|
||||
|
||||
|
||||
|
||||
def setTemperature(self, temperature):
|
||||
|
||||
self.__temperature = temperature
|
||||
@@ -589,63 +376,36 @@ function hide_canvas() {
|
||||
print("current temperature is:", self.__temperature)
|
||||
|
||||
self.notifies()
|
||||
|
||||
|
||||
|
||||
def addObserver(self, observer):
|
||||
|
||||
self.__observers.append(observer)
|
||||
|
||||
|
||||
|
||||
def notifies(self):
|
||||
|
||||
for o in self.__observers:
|
||||
|
||||
o.update(self)
|
||||
|
||||
|
||||
|
||||
class Observer:
|
||||
|
||||
"洗澡模式和饮用模式的父类"
|
||||
|
||||
|
||||
|
||||
def update(self, waterHeater):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class WashingMode(Observer):
|
||||
|
||||
"该模式用于洗澡用"
|
||||
|
||||
|
||||
|
||||
def update(self, waterHeater):
|
||||
|
||||
if waterHeater.getTemperature() >= 50 and waterHeater.getTemperature() < 70:
|
||||
|
||||
print("水已烧好,温度正好!可以用来洗澡了。")
|
||||
|
||||
|
||||
|
||||
class DrinkingMode(Observer):
|
||||
|
||||
"该模式用于饮用"
|
||||
|
||||
|
||||
|
||||
def update(self, waterHeater):
|
||||
|
||||
if waterHeater.getTemperature() >= 100:
|
||||
|
||||
print("水已烧开!可以用来饮用了。")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -667,9 +427,6 @@ class DrinkingMode(Observer):
|
||||
heater.setTemperature(60)
|
||||
|
||||
heater.setTemperature(100)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -683,9 +440,6 @@ current temperature is: 60
|
||||
current temperature is: 100
|
||||
|
||||
水已烧开!可以用来饮用了。
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考监听模式</h3>
|
||||
@@ -709,47 +463,26 @@ current temperature is: 100
|
||||
<pre><code class="language-python">class Observer:
|
||||
|
||||
"观察者的基类"
|
||||
|
||||
|
||||
|
||||
def update(self, observer, object):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class Observable:
|
||||
|
||||
"被观察者的基类"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__observers = []
|
||||
|
||||
|
||||
|
||||
def addObserver(self, observer):
|
||||
|
||||
self.__observers.append(observer)
|
||||
|
||||
|
||||
|
||||
def removeObserver(self, observer):
|
||||
|
||||
self.__observers.remove(observer)
|
||||
|
||||
|
||||
|
||||
def notifyObservers(self, object = 0):
|
||||
|
||||
for o in self.__observers:
|
||||
|
||||
o.update(self, object)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h4>类图</h4>
|
||||
@@ -767,23 +500,14 @@ class Observable:
|
||||
<pre><code class="language-python">class WaterHeater(Observable):
|
||||
|
||||
"热水器:战胜寒冬的有利武器"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
super().__init__()
|
||||
|
||||
self.__temperature = 25
|
||||
|
||||
|
||||
|
||||
def getTemperature(self):
|
||||
|
||||
return self.__temperature
|
||||
|
||||
|
||||
|
||||
def setTemperature(self, temperature):
|
||||
|
||||
self.__temperature = temperature
|
||||
@@ -791,15 +515,9 @@ class Observable:
|
||||
print("current temperature is:", self.__temperature)
|
||||
|
||||
self.notifyObservers()
|
||||
|
||||
|
||||
|
||||
class WashingMode(Observer):
|
||||
|
||||
"该模式用于洗澡用"
|
||||
|
||||
|
||||
|
||||
def update(self, observable, object):
|
||||
|
||||
if isinstance(observable,
|
||||
@@ -807,23 +525,14 @@ class WashingMode(Observer):
|
||||
WaterHeater) and observable.getTemperature() >= 50 and observable.getTemperature() < 70:
|
||||
|
||||
print("水已烧好,温度正好!可以用来洗澡了。")
|
||||
|
||||
|
||||
|
||||
class DrinkingMode(Observer):
|
||||
|
||||
"该模式用于饮用"
|
||||
|
||||
|
||||
|
||||
def update(self, observable, object):
|
||||
|
||||
if isinstance(observable, WaterHeater) and observable.getTemperature() >= 100:
|
||||
|
||||
print("水已烧开!可以用来饮用了。")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码不用变。自己跑一下,会发现输出结果和之前的是一样的。</p>
|
||||
@@ -899,9 +608,6 @@ class DrinkingMode(Observer):
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -909,9 +615,6 @@ class DrinkingMode(Observer):
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -927,17 +630,11 @@ class DrinkingMode(Observer):
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -963,9 +660,6 @@ class DrinkingMode(Observer):
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -977,9 +671,6 @@ class DrinkingMode(Observer):
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -997,12 +688,6 @@ class DrinkingMode(Observer):
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 class="current-tab" 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 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">
|
||||
@@ -601,91 +397,49 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class IHightPerson:
|
||||
|
||||
"接口类,提供空实现的方法,由子类去实现"
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
"获取姓名"
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def getHeight(self):
|
||||
|
||||
"获取身高"
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class HighPerson(IHightPerson):
|
||||
|
||||
"个高的人"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def getHeight(self):
|
||||
|
||||
return 170
|
||||
|
||||
|
||||
|
||||
class ShortPerson:
|
||||
|
||||
"个矮的人"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def getRealHeight(self):
|
||||
|
||||
return 160
|
||||
|
||||
|
||||
|
||||
def getShoesHeight(self):
|
||||
|
||||
return 6
|
||||
|
||||
|
||||
|
||||
class DecoratePerson(ShortPerson, IHightPerson):
|
||||
|
||||
"有高跟鞋搭配的人"
|
||||
|
||||
|
||||
|
||||
def getHeight(self):
|
||||
|
||||
return super().getRealHeight() + super().getShoesHeight()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -703,9 +457,6 @@ class DecoratePerson(ShortPerson, IHightPerson):
|
||||
"""
|
||||
|
||||
return person.getHeight() >= 165;
|
||||
|
||||
|
||||
|
||||
def testPerson():
|
||||
|
||||
lira = HighPerson("Lira")
|
||||
@@ -721,9 +472,6 @@ def testPerson():
|
||||
print(demi.getName() + "身高" + str(demi.getHeight()) + "在高跟鞋的适配下,你身高不输高圆圆,气质不输范冰冰!")
|
||||
|
||||
print("是否适合做接待员:", "符合" if canPlayReceptionist(lira) else "不符合")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -731,15 +479,9 @@ def testPerson():
|
||||
<pre><code>Lira身高170,完美如你,天生的美女!
|
||||
|
||||
是否适合做接待员: 符合
|
||||
|
||||
|
||||
|
||||
Demi身高166在高跟鞋的适配下,你身高不输高圆圆,气质不输范冰冰!
|
||||
|
||||
是否适合做接待员: 符合
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考适配器模式</h3>
|
||||
@@ -873,21 +615,12 @@ Demi身高166在高跟鞋的适配下,你身高不输高圆圆,气质不输
|
||||
def __init__(self, pageNum):
|
||||
|
||||
self.__pageNum = pageNum
|
||||
|
||||
|
||||
|
||||
def getContent(self):
|
||||
|
||||
return "第 " + str(self.__pageNum) + " 页的内容..."
|
||||
|
||||
|
||||
|
||||
class Catalogue:
|
||||
|
||||
"目录结构"
|
||||
|
||||
|
||||
|
||||
def __init__(self, title):
|
||||
|
||||
self.__title = title
|
||||
@@ -897,15 +630,9 @@ class Catalogue:
|
||||
self.setChapter("第一章")
|
||||
|
||||
self.setChapter("第二章")
|
||||
|
||||
|
||||
|
||||
def setChapter(self, title):
|
||||
|
||||
self.__chapters.append(title)
|
||||
|
||||
|
||||
|
||||
def showInfo(self):
|
||||
|
||||
print("标题:" + self.__title)
|
||||
@@ -913,45 +640,24 @@ class Catalogue:
|
||||
for chapter in self.__chapters:
|
||||
|
||||
print(chapter)
|
||||
|
||||
|
||||
|
||||
class IBook:
|
||||
|
||||
"电子书文档的接口类"
|
||||
|
||||
|
||||
|
||||
def parseFile(self, filePath):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def getCatalogue(self):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def getPageCount(self):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def getPage(self, pageNum):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class TxtBook(IBook):
|
||||
|
||||
"TXT解析类"
|
||||
|
||||
|
||||
|
||||
def parseFile(self, filePath):
|
||||
|
||||
# 模拟文档的解析
|
||||
@@ -961,33 +667,18 @@ class TxtBook(IBook):
|
||||
self.__pageCount = 500
|
||||
|
||||
return True
|
||||
|
||||
|
||||
|
||||
def getCatalogue(self):
|
||||
|
||||
return Catalogue("TXT电子书")
|
||||
|
||||
|
||||
|
||||
def getPageCount(self):
|
||||
|
||||
return self.__pageCount
|
||||
|
||||
|
||||
|
||||
def getPage(self, pageNum):
|
||||
|
||||
return Page(pageNum)
|
||||
|
||||
|
||||
|
||||
class EpubBook(IBook):
|
||||
|
||||
"TXT解析类"
|
||||
|
||||
|
||||
|
||||
def parseFile(self, filePath):
|
||||
|
||||
# 模拟文档的解析
|
||||
@@ -997,65 +688,35 @@ class EpubBook(IBook):
|
||||
self.__pageCount = 800
|
||||
|
||||
return True
|
||||
|
||||
|
||||
|
||||
def getCatalogue(self):
|
||||
|
||||
return Catalogue("Epub电子书")
|
||||
|
||||
|
||||
|
||||
def getPageCount(self):
|
||||
|
||||
return self.__pageCount
|
||||
|
||||
|
||||
|
||||
def getPage(self, pageNum):
|
||||
|
||||
return Page(pageNum)
|
||||
|
||||
|
||||
|
||||
class Outline:
|
||||
|
||||
"第三方PDF解析库的目录类"
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class PdfPage:
|
||||
|
||||
"PDF页"
|
||||
|
||||
|
||||
|
||||
def __init__(self, pageNum):
|
||||
|
||||
self.__pageNum = pageNum
|
||||
|
||||
|
||||
|
||||
def getPageNum(self):
|
||||
|
||||
return self.__pageNum
|
||||
|
||||
|
||||
|
||||
class ThirdPdf:
|
||||
|
||||
"第三方PDF解析库"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__pageSize = 0
|
||||
|
||||
|
||||
|
||||
def open(self, filePath):
|
||||
|
||||
print("第三方解析PDF文件:" + filePath)
|
||||
@@ -1063,33 +724,18 @@ class ThirdPdf:
|
||||
self.__pageSize = 1000
|
||||
|
||||
return True
|
||||
|
||||
|
||||
|
||||
def getOutline(self):
|
||||
|
||||
return Outline()
|
||||
|
||||
|
||||
|
||||
def pageSize(self):
|
||||
|
||||
return self.__pageSize
|
||||
|
||||
|
||||
|
||||
def page(self, index):
|
||||
|
||||
return PdfPage(index)
|
||||
|
||||
|
||||
|
||||
class PdfAdapterBook(ThirdPdf, IBook):
|
||||
|
||||
"TXT解析类"
|
||||
|
||||
|
||||
|
||||
def parseFile(self, filePath):
|
||||
|
||||
# 模拟文档的解析
|
||||
@@ -1101,9 +747,6 @@ class PdfAdapterBook(ThirdPdf, IBook):
|
||||
print(filePath + "文件解析成功")
|
||||
|
||||
return rtn
|
||||
|
||||
|
||||
|
||||
def getCatalogue(self):
|
||||
|
||||
outline = super().getOutline()
|
||||
@@ -1111,15 +754,9 @@ class PdfAdapterBook(ThirdPdf, IBook):
|
||||
print("将Outline结构的目录转换成Catalogue结构的目录")
|
||||
|
||||
return Catalogue("PDF电子书")
|
||||
|
||||
|
||||
|
||||
def getPageCount(self):
|
||||
|
||||
return super().pageSize()
|
||||
|
||||
|
||||
|
||||
def getPage(self, pageNum):
|
||||
|
||||
page = self.page(pageNum)
|
||||
@@ -1127,21 +764,12 @@ class PdfAdapterBook(ThirdPdf, IBook):
|
||||
print("将PdfPage的面对象转换成Page的对象")
|
||||
|
||||
return Page(page.getPageNum())
|
||||
|
||||
|
||||
|
||||
# 导入os库
|
||||
|
||||
import os
|
||||
|
||||
|
||||
|
||||
class Reader:
|
||||
|
||||
"阅读器"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
@@ -1151,9 +779,6 @@ class Reader:
|
||||
self.__curBook = None
|
||||
|
||||
self.__curPageNum = -1
|
||||
|
||||
|
||||
|
||||
def __initBook(self, filePath):
|
||||
|
||||
self.__filePath = filePath
|
||||
@@ -1175,9 +800,6 @@ class Reader:
|
||||
else:
|
||||
|
||||
self.__curBook = None
|
||||
|
||||
|
||||
|
||||
def openFile(self, filePath):
|
||||
|
||||
self.__initBook(filePath)
|
||||
@@ -1193,45 +815,27 @@ class Reader:
|
||||
return rtn
|
||||
|
||||
return False
|
||||
|
||||
|
||||
|
||||
def closeFile(self):
|
||||
|
||||
print("关闭 " + self.__filePath + " 文件")
|
||||
|
||||
return True
|
||||
|
||||
|
||||
|
||||
def showCatalogue(self):
|
||||
|
||||
catalogue = self.__curBook.getCatalogue()
|
||||
|
||||
catalogue.showInfo()
|
||||
|
||||
|
||||
|
||||
def prePage(self):
|
||||
|
||||
return self.gotoPage(self.__curPageNum - 1)
|
||||
|
||||
|
||||
|
||||
def nextPage(self):
|
||||
|
||||
return self.gotoPage(self.__curPageNum + 1)
|
||||
|
||||
|
||||
|
||||
def gotoPage(self, pageNum):
|
||||
|
||||
if(pageNum < 1 or pageNum > self.__curBook.getPageCount()):
|
||||
|
||||
return None
|
||||
|
||||
|
||||
|
||||
self.__curPageNum = pageNum
|
||||
|
||||
print("显示第" + str(self.__curPageNum) + "页")
|
||||
@@ -1241,9 +845,6 @@ class Reader:
|
||||
page.getContent()
|
||||
|
||||
return page
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -1265,9 +866,6 @@ class Reader:
|
||||
reader.closeFile()
|
||||
|
||||
print()
|
||||
|
||||
|
||||
|
||||
if (not reader.openFile("平凡的世界.epub")):
|
||||
|
||||
return
|
||||
@@ -1281,9 +879,6 @@ class Reader:
|
||||
reader.closeFile()
|
||||
|
||||
print()
|
||||
|
||||
|
||||
|
||||
if (not reader.openFile("平凡的世界.pdf")):
|
||||
|
||||
return
|
||||
@@ -1295,9 +890,6 @@ class Reader:
|
||||
reader.nextPage()
|
||||
|
||||
reader.closeFile()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p><strong>输出结果:</strong></p>
|
||||
@@ -1315,9 +907,6 @@ class Reader:
|
||||
显示第2页
|
||||
|
||||
关闭 平凡的世界.txt 文件
|
||||
|
||||
|
||||
|
||||
平凡的世界.epub 文件解析成功
|
||||
|
||||
标题:Epub电子书
|
||||
@@ -1331,9 +920,6 @@ class Reader:
|
||||
显示第6页
|
||||
|
||||
关闭 平凡的世界.epub 文件
|
||||
|
||||
|
||||
|
||||
第三方解析PDF文件:平凡的世界.pdf
|
||||
|
||||
平凡的世界.pdf文件解析成功
|
||||
@@ -1355,9 +941,6 @@ class Reader:
|
||||
将PdfPage的面对象转换成Page的对象
|
||||
|
||||
关闭 平凡的世界.pdf 文件
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>应用场景</h3>
|
||||
@@ -1389,9 +972,6 @@ class Reader:
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1399,9 +979,6 @@ class Reader:
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1417,17 +994,11 @@ class Reader:
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1453,9 +1024,6 @@ class Reader:
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1467,9 +1035,6 @@ class Reader:
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1487,12 +1052,6 @@ class Reader:
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 class="current-tab" 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 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">
|
||||
@@ -575,23 +371,14 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class Water:
|
||||
|
||||
"水(H2O)"
|
||||
|
||||
|
||||
|
||||
def __init__(self, state):
|
||||
|
||||
self.__temperature = 25
|
||||
|
||||
self.__state = state
|
||||
|
||||
|
||||
|
||||
def setState(self, state):
|
||||
|
||||
self.__state = state
|
||||
|
||||
|
||||
|
||||
def changeState(self, state):
|
||||
|
||||
if (self.__state):
|
||||
@@ -605,15 +392,9 @@ function hide_canvas() {
|
||||
print("初始化为", state.getStateName())
|
||||
|
||||
self.__state = state
|
||||
|
||||
|
||||
|
||||
def getTemperature(self):
|
||||
|
||||
return self.__temperature
|
||||
|
||||
|
||||
|
||||
def setTemperature(self, temperature):
|
||||
|
||||
self.__temperature = temperature
|
||||
@@ -629,111 +410,60 @@ function hide_canvas() {
|
||||
else:
|
||||
|
||||
self.changeState(GaseousState("气态"))
|
||||
|
||||
|
||||
|
||||
def riseTemperature(self, step):
|
||||
|
||||
self.setTemperature(self.__temperature + step)
|
||||
|
||||
|
||||
|
||||
def reduceTemperature(self, step):
|
||||
|
||||
self.setTemperature(self.__temperature - step)
|
||||
|
||||
|
||||
|
||||
def behavior(self):
|
||||
|
||||
self.__state.behavior(self)
|
||||
|
||||
|
||||
|
||||
class State:
|
||||
|
||||
"状态"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def getStateName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def behavior(self, water):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class SolidState(State):
|
||||
|
||||
"固态"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def behavior(self, water):
|
||||
|
||||
print("我性格高冷,当前体温", water.getTemperature(),
|
||||
|
||||
"摄氏度,我坚如钢铁,仿如一冷血动物,请用我砸人,嘿嘿……")
|
||||
|
||||
|
||||
|
||||
class LiquidState(State):
|
||||
|
||||
"液态"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def behavior(self, water):
|
||||
|
||||
print("我性格温和,当前体温", water.getTemperature(),
|
||||
|
||||
"摄氏度,我可滋润万物,饮用我可让你活力倍增……")
|
||||
|
||||
|
||||
|
||||
class GaseousState(State):
|
||||
|
||||
"气态"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def behavior(self, water):
|
||||
|
||||
print("我性格热烈,当前体温", water.getTemperature(),
|
||||
|
||||
"摄氏度,飞向天空是我毕生的梦想,在这你将看不到我的存在,我将达到无我的境界……")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -765,9 +495,6 @@ class GaseousState(State):
|
||||
water.reduceTemperature(80)
|
||||
|
||||
water.behavior()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -793,9 +520,6 @@ class GaseousState(State):
|
||||
由 液态 变为 固态
|
||||
|
||||
我性格高冷,当前体温 -20 摄氏度,我坚如钢铁,仿如一冷血动物,请用我砸人,嘿嘿……
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考状态模式</h3>
|
||||
@@ -845,17 +569,11 @@ class GaseousState(State):
|
||||
# 实际复杂应用场景中,可以将其单独定义成一个类
|
||||
|
||||
self.__stateInfo = 0
|
||||
|
||||
|
||||
|
||||
def addState(self, state):
|
||||
|
||||
if (state not in self.__states):
|
||||
|
||||
self.__states.append(state)
|
||||
|
||||
|
||||
|
||||
def changeState(self, state):
|
||||
|
||||
if (state is None):
|
||||
@@ -875,15 +593,9 @@ class GaseousState(State):
|
||||
self.addState(state)
|
||||
|
||||
return True
|
||||
|
||||
|
||||
|
||||
def getState(self):
|
||||
|
||||
return self.__curState
|
||||
|
||||
|
||||
|
||||
def _setStateInfo(self, stateInfo):
|
||||
|
||||
self.__stateInfo = stateInfo
|
||||
@@ -893,15 +605,9 @@ class GaseousState(State):
|
||||
if( state.isMatch(stateInfo) ):
|
||||
|
||||
self.changeState(state)
|
||||
|
||||
|
||||
|
||||
def _getStateInfo(self):
|
||||
|
||||
return self.__stateInfo
|
||||
|
||||
|
||||
|
||||
class State:
|
||||
|
||||
"状态的基类"
|
||||
@@ -909,29 +615,17 @@ class State:
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def getStateName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def isMatch(self, stateInfo):
|
||||
|
||||
"状态信息stateInfo是否在当前的状态范围内"
|
||||
|
||||
return False
|
||||
|
||||
|
||||
|
||||
def behavior(self, context):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h4>类图</h4>
|
||||
@@ -947,9 +641,6 @@ class State:
|
||||
<pre><code class="language-python">class Water(Context):
|
||||
|
||||
"水(H2O)"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
super().__init__()
|
||||
@@ -961,33 +652,18 @@ class State:
|
||||
self.addState(GaseousState("气态"))
|
||||
|
||||
self.setTemperature(25)
|
||||
|
||||
|
||||
|
||||
def getTemperature(self):
|
||||
|
||||
return self._getStateInfo()
|
||||
|
||||
|
||||
|
||||
def setTemperature(self, temperature):
|
||||
|
||||
self._setStateInfo(temperature)
|
||||
|
||||
|
||||
|
||||
def riseTemperature(self, step):
|
||||
|
||||
self.setTemperature(self.getTemperature() + step)
|
||||
|
||||
|
||||
|
||||
def reduceTemperature(self, step):
|
||||
|
||||
self.setTemperature(self.getTemperature() - step)
|
||||
|
||||
|
||||
|
||||
def behavior(self):
|
||||
|
||||
state = self.getState()
|
||||
@@ -995,9 +671,6 @@ class State:
|
||||
if(isinstance(state, State)):
|
||||
|
||||
state.behavior(self)
|
||||
|
||||
|
||||
|
||||
# 单例的装饰器
|
||||
|
||||
def singleton(cls, *args, **kwargs):
|
||||
@@ -1005,9 +678,6 @@ def singleton(cls, *args, **kwargs):
|
||||
"构造一个单例的装饰器"
|
||||
|
||||
instance = {}
|
||||
|
||||
|
||||
|
||||
def __singleton(*args, **kwargs):
|
||||
|
||||
if cls not in instance:
|
||||
@@ -1015,33 +685,18 @@ def singleton(cls, *args, **kwargs):
|
||||
instance[cls] = cls(*args, **kwargs)
|
||||
|
||||
return instance[cls]
|
||||
|
||||
|
||||
|
||||
return __singleton
|
||||
|
||||
|
||||
|
||||
@singleton
|
||||
|
||||
class SolidState(State):
|
||||
|
||||
"固态"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def isMatch(self, stateInfo):
|
||||
|
||||
return stateInfo < 0
|
||||
|
||||
|
||||
|
||||
def behavior(self, context):
|
||||
|
||||
if (isinstance(context, Water)):
|
||||
@@ -1049,29 +704,17 @@ class SolidState(State):
|
||||
print("我性格高冷,当前体温", context.getTemperature(),
|
||||
|
||||
"摄氏度,我坚如钢铁,仿如一冷血动物,请用我砸人,嘿嘿……")
|
||||
|
||||
|
||||
|
||||
@singleton
|
||||
|
||||
class LiquidState(State):
|
||||
|
||||
"液态"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def isMatch(self, stateInfo):
|
||||
|
||||
return (stateInfo >= 0 and stateInfo < 100)
|
||||
|
||||
|
||||
|
||||
def behavior(self, context):
|
||||
|
||||
if (isinstance(context, Water)):
|
||||
@@ -1079,29 +722,17 @@ class LiquidState(State):
|
||||
print("我性格温和,当前体温", context.getTemperature(),
|
||||
|
||||
"摄氏度,我可滋润万物,饮用我可让你活力倍增……")
|
||||
|
||||
|
||||
|
||||
@singleton
|
||||
|
||||
class GaseousState(State):
|
||||
|
||||
"气态"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def isMatch(self, stateInfo):
|
||||
|
||||
return stateInfo >= 100
|
||||
|
||||
|
||||
|
||||
def behavior(self, context):
|
||||
|
||||
if (isinstance(context, Water)):
|
||||
@@ -1109,17 +740,11 @@ class GaseousState(State):
|
||||
print("我性格热烈,当前体温", context.getTemperature(),
|
||||
|
||||
"摄氏度,飞向天空是我毕生的梦想,在这你将看不到我的存在,我将达到无我的境界……")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>这里只要改一下上面测试代码的第一行就可以了:</p>
|
||||
|
||||
<pre><code class="language-python">water = Water()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>自己跑一下,会发现输出结果和之前的是一样的。</p>
|
||||
@@ -1163,9 +788,6 @@ class GaseousState(State):
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1173,9 +795,6 @@ class GaseousState(State):
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1191,17 +810,11 @@ class GaseousState(State):
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1227,9 +840,6 @@ class GaseousState(State):
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1241,9 +851,6 @@ class GaseousState(State):
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1261,12 +868,6 @@ class GaseousState(State):
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 class="current-tab" 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 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">
|
||||
@@ -575,9 +371,6 @@ function hide_canvas() {
|
||||
__instance = None
|
||||
|
||||
__isFirstInit = False
|
||||
|
||||
|
||||
|
||||
def __new__(cls, name):
|
||||
|
||||
if not cls.__instance:
|
||||
@@ -585,9 +378,6 @@ function hide_canvas() {
|
||||
MyBeautifulGril.__instance = super().__new__(cls)
|
||||
|
||||
return cls.__instance
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
if not self.__isFirstInit:
|
||||
@@ -601,15 +391,9 @@ function hide_canvas() {
|
||||
else:
|
||||
|
||||
print("遇见" + name + ",我置若罔闻!")
|
||||
|
||||
|
||||
|
||||
def showMyHeart(self):
|
||||
|
||||
print(self.__name + "就我心中的唯一!")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -625,9 +409,6 @@ function hide_canvas() {
|
||||
kimi.showMyHeart()
|
||||
|
||||
print("id(jenny):", id(jenny), " id(kimi):", id(kimi))
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -641,9 +422,6 @@ Jenny就我心中的唯一!
|
||||
Jenny就我心中的唯一!
|
||||
|
||||
id(jenny): 47127888 id(kimi): 47127888
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>看到了没,一旦你初次选定了 Jenny,不管换几个女人,你心中念叨的还是 Jenny!这才是真爱啊!哈哈……</p>
|
||||
@@ -683,9 +461,6 @@ id(jenny): 47127888 id(kimi): 47127888
|
||||
__instance = None
|
||||
|
||||
__isFirstInit = False
|
||||
|
||||
|
||||
|
||||
def __new__(cls, name):
|
||||
|
||||
if not cls.__instance:
|
||||
@@ -693,9 +468,6 @@ id(jenny): 47127888 id(kimi): 47127888
|
||||
Singleton1.__instance = super().__new__(cls)
|
||||
|
||||
return cls.__instance
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
if not self.__isFirstInit:
|
||||
@@ -703,15 +475,9 @@ id(jenny): 47127888 id(kimi): 47127888
|
||||
self.__name = name
|
||||
|
||||
Singleton1.__isFirstInit = True
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
# Test
|
||||
|
||||
tony = Singleton1("Tony")
|
||||
@@ -723,9 +489,6 @@ print(tony.getName(), karry.getName())
|
||||
print("id(tony):", id(tony), "id(karry):", id(karry))
|
||||
|
||||
print("tony == karry:", tony == karry)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -735,9 +498,6 @@ print("tony == karry:", tony == karry)
|
||||
id(tony): 46050320 id(karry): 46050320
|
||||
|
||||
tony == karry: True
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>在 Python 3 的类中,<em>*new</em>* 负责对象的创建,而 <em>*init</em>* 负责对象的初始化;<em>*new</em>* 是一个类方法,而 <em>*init</em>* 是一个对象方法。</p>
|
||||
@@ -757,21 +517,12 @@ tony == karry: True
|
||||
public class Singleton {
|
||||
|
||||
private static Singleton instance = null;
|
||||
|
||||
|
||||
|
||||
private String name;
|
||||
|
||||
|
||||
|
||||
private Singleton(String name) {
|
||||
|
||||
this.name = name;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static Singleton getInstance(String name) {
|
||||
|
||||
if (instance == null) {
|
||||
@@ -785,9 +536,6 @@ public class Singleton {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>Python 中 <em>*new</em>* 和 <em>*init</em>* 都是 public 的,所以我们需要通过重写 <em>*new</em>* 和 <em>*init</em>* 方法来改造对象的创建过来,从而实现单例模式。如果你要更详细地了解 Python 中 <em>*new</em>* 和 <em>*init</em>* 的原理和用法,请参见《<a href="https://blog.csdn.net/luoweifu/article/details/82732313">深入理解 Python 中的 <strong>new</strong> 和 <strong>init</strong></a>》。</p>
|
||||
@@ -797,17 +545,11 @@ public class Singleton {
|
||||
<pre><code class="language-python">class Singleton2(type):
|
||||
|
||||
"""单例实现方式二"""
|
||||
|
||||
|
||||
|
||||
def __init__(cls, what, bases=None, dict=None):
|
||||
|
||||
super().__init__(what, bases, dict)
|
||||
|
||||
cls._instance = None # 初始化全局变量cls._instance为None
|
||||
|
||||
|
||||
|
||||
def __call__(cls, *args, **kwargs):
|
||||
|
||||
# 控制对象的创建过程,如果cls._instance为None则创建,否则直接返回
|
||||
@@ -817,27 +559,15 @@ public class Singleton {
|
||||
cls._instance = super().__call__(*args, **kwargs)
|
||||
|
||||
return cls._instance
|
||||
|
||||
|
||||
|
||||
class CustomClass(metaclass=Singleton2):
|
||||
|
||||
"""用户自定义的类"""
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
tony = CustomClass("Tony")
|
||||
|
||||
karry = CustomClass("Karry")
|
||||
@@ -847,9 +577,6 @@ print(tony.getName(), karry.getName())
|
||||
print("id(tony):", id(tony), "id(karry):", id(karry))
|
||||
|
||||
print("tony == karry:", tony == karry)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -859,9 +586,6 @@ print("tony == karry:", tony == karry)
|
||||
id(tony): 50794608 id(karry): 50794608
|
||||
|
||||
tony == karry: True
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>在上面的代码中,我们定义了一个 metaclass(Singleton2)来控制对象的实例化过程。在定义自己的类时,我们通过 class CustomClass(metaclass=Singleton2) 来显示地指定 metaclass 为 Singleton2。如果你还不太熟悉 metaclass,想了解更多关于它的原理,请参见《[附录 Python 中 metaclass 的原理](》。</p>
|
||||
@@ -873,9 +597,6 @@ tony == karry: True
|
||||
"""定义一个单例装饰器"""
|
||||
|
||||
instance = {}
|
||||
|
||||
|
||||
|
||||
def wrapperSingleton(*args, **kwargs):
|
||||
|
||||
if cls not in instance:
|
||||
@@ -883,33 +604,18 @@ tony == karry: True
|
||||
instance[cls] = cls(*args, **kwargs)
|
||||
|
||||
return instance[cls]
|
||||
|
||||
|
||||
|
||||
return wrapperSingleton
|
||||
|
||||
|
||||
|
||||
@singletonDecorator
|
||||
|
||||
class Singleton3:
|
||||
|
||||
"""使用单例装饰器修饰一个类"""
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
tony = Singleton3("Tony")
|
||||
|
||||
karry = Singleton3("Karry")
|
||||
@@ -919,9 +625,6 @@ print(tony.getName(), karry.getName())
|
||||
print("id(tony):", id(tony), "id(karry):", id(karry))
|
||||
|
||||
print("tony == karry:", tony == karry)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -931,9 +634,6 @@ print("tony == karry:", tony == karry)
|
||||
id(tony): 46206704 id(karry): 46206704
|
||||
|
||||
tony == karry: True
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>装饰器的实质就是对传进来的参数进行补充,可以在原有的类不做任何代码变动的前提下增加额外的功能,使用装饰器可以装饰多个类。用装饰器的方式来实现单例模式,通用性非常好,在实际项目中用的非常多。</p>
|
||||
@@ -953,9 +653,6 @@ tony == karry: True
|
||||
class MyBeautifulGril(object):
|
||||
|
||||
"""我的漂亮女神"""
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
@@ -967,15 +664,9 @@ class MyBeautifulGril(object):
|
||||
else:
|
||||
|
||||
print("遇见" + name + ",我置若罔闻!")
|
||||
|
||||
|
||||
|
||||
def showMyHeart(self):
|
||||
|
||||
print(self.__name + "就我心中的唯一!")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -987,9 +678,6 @@ Jenny就我心中的唯一!
|
||||
Jenny就我心中的唯一!
|
||||
|
||||
id(jenny): 58920752 id(kimi): 58920752
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>应用场景</h3>
|
||||
@@ -1021,9 +709,6 @@ id(jenny): 58920752 id(kimi): 58920752
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1031,9 +716,6 @@ id(jenny): 58920752 id(kimi): 58920752
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1049,17 +731,11 @@ id(jenny): 58920752 id(kimi): 58920752
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1085,9 +761,6 @@ id(jenny): 58920752 id(kimi): 58920752
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1099,9 +772,6 @@ id(jenny): 58920752 id(kimi): 58920752
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1119,12 +789,6 @@ id(jenny): 58920752 id(kimi): 58920752
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 class="current-tab" 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 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">
|
||||
@@ -591,33 +387,18 @@ function hide_canvas() {
|
||||
self.__reason = reason
|
||||
|
||||
self.__leader = None
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def getDayOff(self):
|
||||
|
||||
return self.__dayoff
|
||||
|
||||
|
||||
|
||||
def getReason(self):
|
||||
|
||||
return self.__reason
|
||||
|
||||
|
||||
|
||||
def setLeader(self, leader):
|
||||
|
||||
self.__leader = leader
|
||||
|
||||
|
||||
|
||||
def reuqest(self):
|
||||
|
||||
print(self.__name, "申请请假", self.__dayoff, "天。请假事由:", self.__reason)
|
||||
@@ -625,15 +406,9 @@ function hide_canvas() {
|
||||
if( self.__leader is not None):
|
||||
|
||||
self.__leader.handleRequest(self)
|
||||
|
||||
|
||||
|
||||
class Manager:
|
||||
|
||||
"公司管理人员"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, title):
|
||||
|
||||
self.__name = name
|
||||
@@ -641,51 +416,27 @@ class Manager:
|
||||
self.__title = title
|
||||
|
||||
self.__nextHandler = None
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def getTitle(self):
|
||||
|
||||
return self.__title
|
||||
|
||||
|
||||
|
||||
def setNextHandler(self, nextHandler):
|
||||
|
||||
self.__nextHandler = nextHandler
|
||||
|
||||
|
||||
|
||||
def getNextHandler(self):
|
||||
|
||||
return self.__nextHandler
|
||||
|
||||
|
||||
|
||||
def handleRequest(self, person):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class Supervisor(Manager):
|
||||
|
||||
"主管"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, title):
|
||||
|
||||
super().__init__(name, title)
|
||||
|
||||
|
||||
|
||||
def handleRequest(self, person):
|
||||
|
||||
if(person.getDayOff() <= 2):
|
||||
@@ -697,9 +448,6 @@ class Supervisor(Manager):
|
||||
if(nextHander is not None):
|
||||
|
||||
nextHander.handleRequest(person)
|
||||
|
||||
|
||||
|
||||
class DepartmentManager(Manager):
|
||||
|
||||
"部门总监"
|
||||
@@ -707,9 +455,6 @@ class DepartmentManager(Manager):
|
||||
def __init__(self, name, title):
|
||||
|
||||
super().__init__(name, title)
|
||||
|
||||
|
||||
|
||||
def handleRequest(self, person):
|
||||
|
||||
if(person.getDayOff() >2 and person.getDayOff() <= 5):
|
||||
@@ -721,21 +466,12 @@ class DepartmentManager(Manager):
|
||||
if(nextHander is not None):
|
||||
|
||||
nextHander.handleRequest(person)
|
||||
|
||||
|
||||
|
||||
class CEO(Manager):
|
||||
|
||||
"CEO"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, title):
|
||||
|
||||
super().__init__(name, title)
|
||||
|
||||
|
||||
|
||||
def handleRequest(self, person):
|
||||
|
||||
if (person.getDayOff() > 5 and person.getDayOff() <= 22):
|
||||
@@ -747,29 +483,17 @@ class CEO(Manager):
|
||||
if (nextHander is not None):
|
||||
|
||||
nextHander.handleRequest(person)
|
||||
|
||||
|
||||
|
||||
class Administrator(Manager):
|
||||
|
||||
"行政人员"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, title):
|
||||
|
||||
super().__init__(name, title)
|
||||
|
||||
|
||||
|
||||
def handleRequest(self, person):
|
||||
|
||||
print(person.getName(), "的请假申请已审核,情况属实!已备案处理。处理人:", self.getName(), "(", self.getTitle(), ")\n")
|
||||
|
||||
nextHander = self.getNextHandler()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -789,9 +513,6 @@ class Administrator(Manager):
|
||||
departmentLeader.setNextHandler(ceo)
|
||||
|
||||
ceo.setNextHandler(administrator)
|
||||
|
||||
|
||||
|
||||
sunny = Person("Sunny", 1, "参加MDCC大会。")
|
||||
|
||||
sunny.setLeader(directLeader)
|
||||
@@ -809,9 +530,6 @@ class Administrator(Manager):
|
||||
pony.setLeader(directLeader)
|
||||
|
||||
pony.reuqest()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -821,25 +539,16 @@ class Administrator(Manager):
|
||||
同意 Sunny 请假,签字人: Eren ( 客户端研发部经理 )
|
||||
|
||||
Sunny 的请假申请已审核,情况属实!已备案处理。处理人: Nina ( 行政中心总监 )
|
||||
|
||||
|
||||
|
||||
Tony 申请请假 5 天。请假事由: 家里有紧急事情!
|
||||
|
||||
同意 Tony 请假,签字人: Eric ( 技术研发中心总监 )
|
||||
|
||||
Tony 的请假申请已审核,情况属实!已备案处理。处理人: Nina ( 行政中心总监 )
|
||||
|
||||
|
||||
|
||||
Pony 申请请假 15 天。请假事由: 出国深造。
|
||||
|
||||
同意 Pony 请假,签字人: Helen ( 创新文化公司CEO )
|
||||
|
||||
Pony 的请假申请已审核,情况属实!已备案处理。处理人: Nina ( 行政中心总监 )
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考职责模式</h3>
|
||||
@@ -863,9 +572,6 @@ Pony 的请假申请已审核,情况属实!已备案处理。处理人: Ni
|
||||
<pre><code class="language-python">class Request:
|
||||
|
||||
"请求(内容)"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, dayoff, reason):
|
||||
|
||||
self.__name = name
|
||||
@@ -875,33 +581,18 @@ Pony 的请假申请已审核,情况属实!已备案处理。处理人: Ni
|
||||
self.__reason = reason
|
||||
|
||||
self.__leader = None
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def getDayOff(self):
|
||||
|
||||
return self.__dayoff
|
||||
|
||||
|
||||
|
||||
def getReason(self):
|
||||
|
||||
return self.__reason
|
||||
|
||||
|
||||
|
||||
class Responsible:
|
||||
|
||||
"责任人的抽象类"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, title):
|
||||
|
||||
self.__name = name
|
||||
@@ -909,39 +600,21 @@ class Responsible:
|
||||
self.__title = title
|
||||
|
||||
self.__nextHandler = None
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def getTitle(self):
|
||||
|
||||
return self.__title
|
||||
|
||||
|
||||
|
||||
def setNextHandler(self, nextHandler):
|
||||
|
||||
self.__nextHandler = nextHandler
|
||||
|
||||
|
||||
|
||||
def getNextHandler(self):
|
||||
|
||||
return self.__nextHandler
|
||||
|
||||
|
||||
|
||||
def handleRequest(self, request):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h4>类图</h4>
|
||||
@@ -957,41 +630,23 @@ class Responsible:
|
||||
<pre><code class="language-python">class Person:
|
||||
|
||||
"请求者"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
self.__leader = None
|
||||
|
||||
|
||||
|
||||
def setName(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def setLeader(self, leader):
|
||||
|
||||
self.__leader = leader
|
||||
|
||||
|
||||
|
||||
def getLeader(self):
|
||||
|
||||
return self.__leader
|
||||
|
||||
|
||||
|
||||
def sendReuqest(self, request):
|
||||
|
||||
print(self.__name, "申请请假", request.getDayOff(), "天。请假事由:", request.getReason())
|
||||
@@ -999,21 +654,12 @@ class Responsible:
|
||||
if (self.__leader is not None):
|
||||
|
||||
self.__leader.handleRequest(request)
|
||||
|
||||
|
||||
|
||||
class Supervisor(Responsible):
|
||||
|
||||
"主管"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, title):
|
||||
|
||||
super().__init__(name, title)
|
||||
|
||||
|
||||
|
||||
def handleRequest(self, request):
|
||||
|
||||
if (request.getDayOff() <= 2):
|
||||
@@ -1025,21 +671,12 @@ class Supervisor(Responsible):
|
||||
if (nextHander is not None):
|
||||
|
||||
nextHander.handleRequest(request)
|
||||
|
||||
|
||||
|
||||
class DepartmentManager(Responsible):
|
||||
|
||||
"部门总监"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, title):
|
||||
|
||||
super().__init__(name, title)
|
||||
|
||||
|
||||
|
||||
def handleRequest(self, request):
|
||||
|
||||
if (request.getDayOff() > 2 and request.getDayOff() <= 5):
|
||||
@@ -1051,21 +688,12 @@ class DepartmentManager(Responsible):
|
||||
if (nextHander is not None):
|
||||
|
||||
nextHander.handleRequest(request)
|
||||
|
||||
|
||||
|
||||
class CEO(Responsible):
|
||||
|
||||
"CEO"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, title):
|
||||
|
||||
super().__init__(name, title)
|
||||
|
||||
|
||||
|
||||
def handleRequest(self, request):
|
||||
|
||||
if (request.getDayOff() > 5 and request.getDayOff() <= 22):
|
||||
@@ -1077,29 +705,17 @@ class CEO(Responsible):
|
||||
if (nextHander is not None):
|
||||
|
||||
nextHander.handleRequest(request)
|
||||
|
||||
|
||||
|
||||
class Administrator(Responsible):
|
||||
|
||||
"行政人员"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, title):
|
||||
|
||||
super().__init__(name, title)
|
||||
|
||||
|
||||
|
||||
def handleRequest(self, request):
|
||||
|
||||
print(request.getName(), "的请假申请已审核,情况属实!已备案处理。处理人:", self.getName(), "(", self.getTitle(), ")\n")
|
||||
|
||||
nextHander = self.getNextHandler()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码需要稍微修改一下:</p>
|
||||
@@ -1119,9 +735,6 @@ class Administrator(Responsible):
|
||||
departmentLeader.setNextHandler(ceo)
|
||||
|
||||
ceo.setNextHandler(administrator)
|
||||
|
||||
|
||||
|
||||
sunny = Person("Sunny")
|
||||
|
||||
sunny.setLeader(directLeader)
|
||||
@@ -1139,9 +752,6 @@ class Administrator(Responsible):
|
||||
pony.setLeader(directLeader)
|
||||
|
||||
pony.sendReuqest(Request(pony.getName(), 15, "出国深造。"))
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>自己跑一下,会发现输出结果和之前的是一样的。</p>
|
||||
@@ -1233,9 +843,6 @@ class Administrator(Responsible):
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1243,9 +850,6 @@ class Administrator(Responsible):
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1261,17 +865,11 @@ class Administrator(Responsible):
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1297,9 +895,6 @@ class Administrator(Responsible):
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1311,9 +906,6 @@ class Administrator(Responsible):
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1331,12 +923,6 @@ class Administrator(Responsible):
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 class="current-tab" 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 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">
|
||||
@@ -587,9 +383,6 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class HouseInfo:
|
||||
|
||||
"房源信息"
|
||||
|
||||
|
||||
|
||||
def __init__(self, area, price, hasWindow, bathroom, kitchen, address, owner):
|
||||
|
||||
self.__area = area
|
||||
@@ -605,21 +398,12 @@ function hide_canvas() {
|
||||
self.__address = address
|
||||
|
||||
self.__owner = owner
|
||||
|
||||
|
||||
|
||||
def getAddress(self):
|
||||
|
||||
return self.__address
|
||||
|
||||
|
||||
|
||||
def getOwnerName(self):
|
||||
|
||||
return self.__owner.getName()
|
||||
|
||||
|
||||
|
||||
def showInfo(self, isShowOwner = True):
|
||||
|
||||
print("面积:" + str(self.__area) + "平米",
|
||||
@@ -635,35 +419,20 @@ function hide_canvas() {
|
||||
"地址:" + self.getAddress(),
|
||||
|
||||
"房东:" + self.getOwnerName() if isShowOwner else "")
|
||||
|
||||
|
||||
|
||||
class HousingAgency:
|
||||
|
||||
"房屋中介"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__houseInfos = []
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def addHouseInfo(self, houseInfo):
|
||||
|
||||
self.__houseInfos.append(houseInfo)
|
||||
|
||||
|
||||
|
||||
def removeHouseInfo(self, houseInfo):
|
||||
|
||||
for info in self.__houseInfos:
|
||||
@@ -671,17 +440,11 @@ class HousingAgency:
|
||||
if(info == houseInfo):
|
||||
|
||||
self.__houseInfos.remove(info)
|
||||
|
||||
|
||||
|
||||
def getSearchCondition(self, description):
|
||||
|
||||
"这里有一个将用户描述信息转换成搜索条件的逻辑。(为节省篇幅这里原样返回描述)"
|
||||
|
||||
return description
|
||||
|
||||
|
||||
|
||||
def getMatchInfos(self, searchCondition):
|
||||
|
||||
"根据房源信息的各个属性查找最匹配的信息。(为节省篇幅这里略去匹配的过程,全部输出)"
|
||||
@@ -693,9 +456,6 @@ class HousingAgency:
|
||||
info.showInfo(False)
|
||||
|
||||
return self.__houseInfos
|
||||
|
||||
|
||||
|
||||
def signContract(self, houseInfo, time):
|
||||
|
||||
"与房东签订协议"
|
||||
@@ -703,23 +463,14 @@ class HousingAgency:
|
||||
print(self.getName(), "与房东", houseInfo.getOwnerName(), "签订", houseInfo.getAddress(),
|
||||
|
||||
"的房子的的租赁合同,租期", time, "年。 合同期内", self.getName(), "有权对其进行使用和转租!")
|
||||
|
||||
|
||||
|
||||
def signContracts(self, time):
|
||||
|
||||
for info in self.__houseInfos :
|
||||
|
||||
self.signContract(info, time)
|
||||
|
||||
|
||||
|
||||
class HouseOwner:
|
||||
|
||||
"房东"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, address):
|
||||
|
||||
self.__name = name
|
||||
@@ -727,27 +478,15 @@ class HouseOwner:
|
||||
self.__address = address
|
||||
|
||||
self.__houseInfo = None
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def getAddress(self):
|
||||
|
||||
return self.__address
|
||||
|
||||
|
||||
|
||||
def setHouseInfo(self, area, price, hasWindow, bathroom, kitchen):
|
||||
|
||||
self.__houseInfo = HouseInfo(area, price, hasWindow, bathroom, kitchen, self.getAddress(), self)
|
||||
|
||||
|
||||
|
||||
def publishHouseInfo(self, agency):
|
||||
|
||||
agency.addHouseInfo(self.__houseInfo)
|
||||
@@ -755,27 +494,15 @@ class HouseOwner:
|
||||
print(self.getName() + "在", agency.getName(), "发布房源出租信息:")
|
||||
|
||||
self.__houseInfo.showInfo()
|
||||
|
||||
|
||||
|
||||
class Custom:
|
||||
|
||||
"房客,租房人"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def findHouse(self, description, agency):
|
||||
|
||||
print("我是" + self.getName() + ", 我想要找一个\"" + description + "\"的房子")
|
||||
@@ -783,9 +510,6 @@ class Custom:
|
||||
print()
|
||||
|
||||
return agency.getMatchInfos(agency.getSearchCondition(description))
|
||||
|
||||
|
||||
|
||||
def seeHouse(self, houseInfos):
|
||||
|
||||
"去看房,选择最使用的房子。(这里省略看房的过程)"
|
||||
@@ -793,9 +517,6 @@ class Custom:
|
||||
size = len(houseInfos)
|
||||
|
||||
return houseInfos[size-1]
|
||||
|
||||
|
||||
|
||||
def signContract(self, houseInfo, agency, time):
|
||||
|
||||
"与中介签订协议"
|
||||
@@ -803,9 +524,6 @@ class Custom:
|
||||
print(self.getName(), "与中介", agency.getName(), "签订", houseInfo.getAddress(),
|
||||
|
||||
"的房子的租赁合同, 租期", time, "年。合同期内", self.__name, "有权对其进行使用!")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -833,15 +551,9 @@ class Custom:
|
||||
wangwu.publishHouseInfo(myHome)
|
||||
|
||||
print()
|
||||
|
||||
|
||||
|
||||
myHome.signContracts(3)
|
||||
|
||||
print()
|
||||
|
||||
|
||||
|
||||
tony = Custom("Tony")
|
||||
|
||||
houseInfos = tony.findHouse("18平米左右,要有独卫,要有窗户,最好是朝南,有厨房更好!价位在2000左右", myHome)
|
||||
@@ -855,9 +567,6 @@ class Custom:
|
||||
AppropriateHouse = tony.seeHouse(houseInfos)
|
||||
|
||||
tony.signContract(AppropriateHouse, myHome, 1)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -873,21 +582,12 @@ class Custom:
|
||||
王五在 我爱我家 发布房源出租信息:
|
||||
|
||||
面积:18平米 价格:2600元 窗户:有 卫生间:独立卫生间 厨房:有 地址:金隅美和园 房东:王五
|
||||
|
||||
|
||||
|
||||
我爱我家 与房东 张三 签订 上地西里 的房子的的租赁合同,租期 3 年。 合同期内 我爱我家 有权对其进行使用和转租!
|
||||
|
||||
我爱我家 与房东 李四 签订 当代城市家园 的房子的的租赁合同,租期 3 年。 合同期内 我爱我家 有权对其进行使用和转租!
|
||||
|
||||
我爱我家 与房东 王五 签订 金隅美和园 的房子的的租赁合同,租期 3 年。 合同期内 我爱我家 有权对其进行使用和转租!
|
||||
|
||||
|
||||
|
||||
我是Tony, 我想要找一个"18平米左右,要有独卫,要有窗户,最好是朝南,有厨房更好!价位在2000左右"的房子
|
||||
|
||||
|
||||
|
||||
我爱我家 为您找以下最适合的房源:
|
||||
|
||||
面积:20平米 价格:2500元 窗户:有 卫生间:独立卫生间 厨房:没有 地址:上地西里
|
||||
@@ -895,17 +595,8 @@ class Custom:
|
||||
面积:16平米 价格:1800元 窗户:有 卫生间:公用卫生间 厨房:没有 地址:当代城市家园
|
||||
|
||||
面积:18平米 价格:2600元 窗户:有 卫生间:独立卫生间 厨房:有 地址:金隅美和园
|
||||
|
||||
|
||||
|
||||
正在看房,寻找最合适的住巢……
|
||||
|
||||
|
||||
|
||||
Tony 与中介 我爱我家 签订 金隅美和园 的房子的租赁合同, 租期 1 年。合同期内 Tony 有权对其进行使用!
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考中介模式</h3>
|
||||
@@ -1013,9 +704,6 @@ Tony 与中介 我爱我家 签订 金隅美和园 的房子的租赁合同, 租
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1023,9 +711,6 @@ Tony 与中介 我爱我家 签订 金隅美和园 的房子的租赁合同, 租
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1041,17 +726,11 @@ Tony 与中介 我爱我家 签订 金隅美和园 的房子的租赁合同, 租
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1077,9 +756,6 @@ Tony 与中介 我爱我家 签订 金隅美和园 的房子的租赁合同, 租
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1091,9 +767,6 @@ Tony 与中介 我爱我家 签订 金隅美和园 的房子的租赁合同, 租
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1111,12 +784,6 @@ Tony 与中介 我爱我家 签订 金隅美和园 的房子的租赁合同, 租
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 class="current-tab" 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 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">
|
||||
@@ -569,69 +365,39 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class ReceiveParcel:
|
||||
|
||||
"接收包裹"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def receive(self, parcelContent):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class TonyReception(ReceiveParcel):
|
||||
|
||||
"Tony接收"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, phoneNum):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
self.__phoneNum = phoneNum
|
||||
|
||||
|
||||
|
||||
def getPhoneNum(self):
|
||||
|
||||
return self.__phoneNum
|
||||
|
||||
|
||||
|
||||
def receive(self, parcelContent):
|
||||
|
||||
print("货物主人:" + self.getName() + ", 手机号:" + self.getPhoneNum())
|
||||
|
||||
print("接收到一个包裹,包裹内容:" + parcelContent)
|
||||
|
||||
|
||||
|
||||
class WendyReception(ReceiveParcel):
|
||||
|
||||
"Wendy接收"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, receiver):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
self.__receiver = receiver
|
||||
|
||||
|
||||
|
||||
def receive(self, parcelContent):
|
||||
|
||||
print("我是" + self.__receiver.getName() + "的朋友, 我来帮他代收快递!")
|
||||
@@ -641,9 +407,6 @@ class WendyReception(ReceiveParcel):
|
||||
self.__receiver.receive(parcelContent)
|
||||
|
||||
print("代收人:" + self.getName())
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -655,9 +418,6 @@ class WendyReception(ReceiveParcel):
|
||||
wendy = WendyReception("Wendy", tony)
|
||||
|
||||
wendy.receive("雪地靴")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -669,9 +429,6 @@ class WendyReception(ReceiveParcel):
|
||||
接收到一个包裹,包裹内容:雪地靴
|
||||
|
||||
代收人:Wendy
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考代理模式</h3>
|
||||
@@ -703,39 +460,21 @@ class WendyReception(ReceiveParcel):
|
||||
<pre><code class="language-python">class Subject:
|
||||
|
||||
"主题"
|
||||
|
||||
|
||||
|
||||
def request(self):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class RealSubject(Subject):
|
||||
|
||||
"代理主题"
|
||||
|
||||
|
||||
|
||||
def request(self):
|
||||
|
||||
print("RealSubject todo something...")
|
||||
|
||||
|
||||
|
||||
class ProxySubject(Subject):
|
||||
|
||||
"代理主题"
|
||||
|
||||
|
||||
|
||||
def __init__(self, subject):
|
||||
|
||||
self.__realSubject = subject
|
||||
|
||||
|
||||
|
||||
def request(self):
|
||||
|
||||
self.preRequest()
|
||||
@@ -745,21 +484,12 @@ class ProxySubject(Subject):
|
||||
self.__realSubject.request()
|
||||
|
||||
self.afterRequest()
|
||||
|
||||
|
||||
|
||||
def preRequest(self):
|
||||
|
||||
print("preRequest")
|
||||
|
||||
|
||||
|
||||
def afterRequest(self):
|
||||
|
||||
print("afterRequest")
|
||||
|
||||
|
||||
|
||||
def client():
|
||||
|
||||
"客户端调用类"
|
||||
@@ -769,9 +499,6 @@ def client():
|
||||
proxyObj = ProxySubject(realObj)
|
||||
|
||||
proxyObj.request()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h4>类图</h4>
|
||||
@@ -789,17 +516,11 @@ def client():
|
||||
<pre><code class="language-python">class WendyReception(ReceiveParcel):
|
||||
|
||||
"Wendy接收"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, receiver):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
self.__receiver = receiver
|
||||
|
||||
|
||||
|
||||
def receive(self, parcelContent):
|
||||
|
||||
self.preReceive()
|
||||
@@ -809,21 +530,12 @@ def client():
|
||||
self.__receiver.receive(parcelContent)
|
||||
|
||||
self.afterReceive()
|
||||
|
||||
|
||||
|
||||
def preReceive(self):
|
||||
|
||||
print("我是" + self.__receiver.getName() + "的朋友, 我来帮他代收快递!")
|
||||
|
||||
|
||||
|
||||
def afterReceive(self):
|
||||
|
||||
print("代收人:" + self.getName())
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码不用变。自己跑一下,会发现输出结果和之前的是一样的。</p>
|
||||
@@ -885,9 +597,6 @@ def client():
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -895,9 +604,6 @@ def client():
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -913,17 +619,11 @@ def client():
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -949,9 +649,6 @@ def client():
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -963,9 +660,6 @@ def client():
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -983,12 +677,6 @@ def client():
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 class="current-tab" 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 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">
|
||||
@@ -573,221 +369,122 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class Person:
|
||||
|
||||
"人"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def wear(self):
|
||||
|
||||
print("我的着装是:")
|
||||
|
||||
|
||||
|
||||
class Engineer(Person):
|
||||
|
||||
"工程师"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, skill):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
self.__skill = skill
|
||||
|
||||
|
||||
|
||||
def getSkill(self):
|
||||
|
||||
return self.__skill
|
||||
|
||||
|
||||
|
||||
def wear(self):
|
||||
|
||||
print("我是" + self.getSkill() + "工程师" + self.getName())
|
||||
|
||||
super().wear()
|
||||
|
||||
|
||||
|
||||
class Teacher(Person):
|
||||
|
||||
"教师"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, title):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
self.__title = title
|
||||
|
||||
|
||||
|
||||
def getTitle(self):
|
||||
|
||||
return self.__title
|
||||
|
||||
|
||||
|
||||
def wear(self):
|
||||
|
||||
print("我是" + self.getName() + self.getTitle())
|
||||
|
||||
super().wear()
|
||||
|
||||
|
||||
|
||||
class ClothingDecorator(Person):
|
||||
|
||||
"服装装饰器"
|
||||
|
||||
|
||||
|
||||
def __init__(self, person):
|
||||
|
||||
self._decorated = person
|
||||
|
||||
|
||||
|
||||
def wear(self):
|
||||
|
||||
self._decorated.wear()
|
||||
|
||||
|
||||
|
||||
class CasualPantDecorator(ClothingDecorator):
|
||||
|
||||
"休闲裤"
|
||||
|
||||
|
||||
|
||||
def __init__(self, person):
|
||||
|
||||
super().__init__(person)
|
||||
|
||||
|
||||
|
||||
def wear(self):
|
||||
|
||||
super().wear()
|
||||
|
||||
print("一条卡其色休闲裤")
|
||||
|
||||
|
||||
|
||||
class BeltDecorator(ClothingDecorator):
|
||||
|
||||
"腰带"
|
||||
|
||||
|
||||
|
||||
def __init__(self, person):
|
||||
|
||||
super().__init__(person)
|
||||
|
||||
|
||||
|
||||
def wear(self):
|
||||
|
||||
super().wear()
|
||||
|
||||
print("一条银色针扣头的黑色腰带")
|
||||
|
||||
|
||||
|
||||
class LeatherShoesDecorator(ClothingDecorator):
|
||||
|
||||
"皮鞋"
|
||||
|
||||
|
||||
|
||||
def __init__(self, person):
|
||||
|
||||
super().__init__(person)
|
||||
|
||||
|
||||
|
||||
def wear(self):
|
||||
|
||||
super().wear()
|
||||
|
||||
print("一双深色休闲皮鞋")
|
||||
|
||||
|
||||
|
||||
class KnittedSweaterDecorator(ClothingDecorator):
|
||||
|
||||
"针织毛衣"
|
||||
|
||||
|
||||
|
||||
def __init__(self, person):
|
||||
|
||||
super().__init__(person)
|
||||
|
||||
|
||||
|
||||
def wear(self):
|
||||
|
||||
super().wear()
|
||||
|
||||
print("一件紫红色针织毛衣")
|
||||
|
||||
|
||||
|
||||
class WhiteShirtDecorator(ClothingDecorator):
|
||||
|
||||
"白色衬衫"
|
||||
|
||||
|
||||
|
||||
def __init__(self, person):
|
||||
|
||||
super().__init__(person)
|
||||
|
||||
|
||||
|
||||
def wear(self):
|
||||
|
||||
super().wear()
|
||||
|
||||
print("一件白色衬衫")
|
||||
|
||||
|
||||
|
||||
class GlassesDecorator(ClothingDecorator):
|
||||
|
||||
"眼镜"
|
||||
|
||||
|
||||
|
||||
def __init__(self, person):
|
||||
|
||||
super().__init__(person)
|
||||
|
||||
|
||||
|
||||
def wear(self):
|
||||
|
||||
super().wear()
|
||||
|
||||
print("一副方形黑框眼镜")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -809,25 +506,16 @@ class GlassesDecorator(ClothingDecorator):
|
||||
glasses = GlassesDecorator(sweater)
|
||||
|
||||
glasses.wear()
|
||||
|
||||
|
||||
|
||||
print()
|
||||
|
||||
decorateTeacher = GlassesDecorator(WhiteShirtDecorator(LeatherShoesDecorator(Teacher("wells", "教授"))))
|
||||
|
||||
decorateTeacher.wear()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>上面的测试代码中:</p>
|
||||
|
||||
<pre><code>decorateTeacher = GlassesDecorator(WhiteShirtDecorator(LeatherShoesDecorator(Teacher("wells", "教授"))))
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>这个写法,大家不要觉得奇怪,它其实就是将多个对象的创建过程合在了一起,其实是一种优雅的写法(是不是少了好几行代码?)。创建的 Teacher 对象又通过参数传给 LeatherShoesDecorator 的构造函数,而创建的 LeatherShoesDecorator 对象又通过参数传给 WhiteShirtDecorator 的构造函数,以此类推……</p>
|
||||
@@ -849,9 +537,6 @@ class GlassesDecorator(ClothingDecorator):
|
||||
一件紫红色针织毛衣
|
||||
|
||||
一副方形黑框眼镜
|
||||
|
||||
|
||||
|
||||
我是wells教授
|
||||
|
||||
我的着装是:
|
||||
@@ -861,9 +546,6 @@ class GlassesDecorator(ClothingDecorator):
|
||||
一件白色衬衫
|
||||
|
||||
一副方形黑框眼镜
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考装饰模式</h3>
|
||||
@@ -931,9 +613,6 @@ class GlassesDecorator(ClothingDecorator):
|
||||
glasses = GlassesDecorator(shirt)
|
||||
|
||||
glasses.wear()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>结果如下:</p>
|
||||
@@ -953,9 +632,6 @@ class GlassesDecorator(ClothingDecorator):
|
||||
一件白色衬衫
|
||||
|
||||
一副方形黑框眼镜
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>装饰模式的模型抽象</h3>
|
||||
@@ -1013,17 +689,11 @@ class GlassesDecorator(ClothingDecorator):
|
||||
<pre><code class="language-java">DataInputStream dataInputStream = new DataInputStream(new FileInputStream("C:/text.txt"));
|
||||
|
||||
DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("C:/text.txt"));
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>这个写法与上面 Demo 中的</p>
|
||||
|
||||
<pre><code>decorateTeacher = GlassesDecorator(WhiteShirtDecorator(LeatherShoesDecorator(Teacher("wells", "教授"))))
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>是不是很相似?都是一个对象套一个对象的方式进行创建。</p>
|
||||
@@ -1049,9 +719,6 @@ DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(&q
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1059,9 +726,6 @@ DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(&q
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1077,17 +741,11 @@ DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(&q
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1113,9 +771,6 @@ DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(&q
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1127,9 +782,6 @@ DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(&q
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1147,12 +799,6 @@ DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(&q
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 class="current-tab" 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 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,69 +363,36 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class Coffee:
|
||||
|
||||
"咖啡"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def getTaste(self):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class CaffeLatte(Coffee):
|
||||
|
||||
"拿铁咖啡"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def getTaste(self):
|
||||
|
||||
return "轻柔而香醇。"
|
||||
|
||||
|
||||
|
||||
class MochaCoffee(Coffee):
|
||||
|
||||
"摩卡咖啡"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def getTaste(self):
|
||||
|
||||
return "丝滑与醇厚。"
|
||||
|
||||
|
||||
|
||||
class Coffeemaker:
|
||||
|
||||
"咖啡机"
|
||||
|
||||
|
||||
|
||||
@staticmethod
|
||||
|
||||
def makeCoffee(coffeeBean):
|
||||
@@ -649,9 +412,6 @@ class Coffeemaker:
|
||||
coffee = Coffee()
|
||||
|
||||
return coffee
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -665,9 +425,6 @@ class Coffeemaker:
|
||||
mocha = Coffeemaker.makeCoffee("摩卡风味咖啡豆")
|
||||
|
||||
print(mocha.getName(), "已为您准备好了,口感:" + mocha.getTaste() + "请慢慢享用!")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -675,9 +432,6 @@ class Coffeemaker:
|
||||
<pre><code>拿铁咖啡 已为您准备好了,口感:轻柔而香醇。请慢慢享用!
|
||||
|
||||
摩卡咖啡 已为您准备好了,口感:丝滑与醇厚。请慢慢享用!
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考工厂模式</h3>
|
||||
@@ -745,9 +499,6 @@ class Coffeemaker:
|
||||
from enum import Enum
|
||||
|
||||
# Python3.4 之后支持枚举 Enum 的语法
|
||||
|
||||
|
||||
|
||||
class PenType(Enum):
|
||||
|
||||
"""画笔类型"""
|
||||
@@ -757,109 +508,58 @@ class PenType(Enum):
|
||||
PenTypeRect = 2
|
||||
|
||||
PenTypeEllipse = 3
|
||||
|
||||
|
||||
|
||||
class Pen(metaclass=ABCMeta):
|
||||
|
||||
"""画笔"""
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
@abstractmethod
|
||||
|
||||
def getType(self):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
class LinePen(Pen):
|
||||
|
||||
"""直线画笔"""
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def getType(self):
|
||||
|
||||
return PenType.PenTypeLine
|
||||
|
||||
|
||||
|
||||
class RectanglePen(Pen):
|
||||
|
||||
"""矩形画笔"""
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def getType(self):
|
||||
|
||||
return PenType.PenTypeRect
|
||||
|
||||
|
||||
|
||||
class EllipsePen(Pen):
|
||||
|
||||
"""椭圆画笔"""
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def getType(self):
|
||||
|
||||
return PenType.PenTypeEllipse
|
||||
|
||||
|
||||
|
||||
class PenFactory:
|
||||
|
||||
"""画笔工厂类"""
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
"定义一个字典(key:PenType,value:Pen)来存放对象,确保每一个类型只会有一个对象"
|
||||
|
||||
self.__pens = {}
|
||||
|
||||
|
||||
|
||||
def getSingleObj(self, penType, name):
|
||||
|
||||
"""获得唯一实例的对象"""
|
||||
|
||||
|
||||
|
||||
def createPen(self, penType):
|
||||
|
||||
"""创建画笔"""
|
||||
@@ -889,9 +589,6 @@ class PenFactory:
|
||||
# 否则直接返回字典中的对象
|
||||
|
||||
return self.__pens[penType]
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -915,9 +612,6 @@ class PenFactory:
|
||||
ellipsePen = factory.createPen(PenType.PenTypeEllipse)
|
||||
|
||||
print("创建了 %s,对象id:%s, 类型:%s" % (ellipsePen.getName(), id(ellipsePen), ellipsePen.getType()) )
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果</p>
|
||||
@@ -929,9 +623,6 @@ class PenFactory:
|
||||
创建了 矩形画笔,对象id:61077936, 类型:PenType.PenTypeRect
|
||||
|
||||
创建了 椭圆画笔,对象id:61077904, 类型:PenType.PenTypeEllipse
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>看到了吗?在上面的 Demo 中,我们 Create 了两次矩形画笔的对象 rectPen 和 rectPen2,但这两个变量指向的是同一个对象,因为对象的 ID 是一样的,说明通过这种方式我们实现了每一个类型只创建一个对象。</p>
|
||||
@@ -1079,9 +770,6 @@ class PenFactory:
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1089,9 +777,6 @@ class PenFactory:
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1107,17 +792,11 @@ class PenFactory:
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1143,9 +822,6 @@ class PenFactory:
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1157,9 +833,6 @@ class PenFactory:
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1177,12 +850,6 @@ class PenFactory:
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 class="current-tab" 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 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">
|
||||
@@ -569,9 +365,6 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class Customer:
|
||||
|
||||
"客户"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
@@ -579,65 +372,35 @@ function hide_canvas() {
|
||||
self.__num = 0
|
||||
|
||||
self.__clinics = None
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def register(self, system):
|
||||
|
||||
system.pushCustomer(self)
|
||||
|
||||
|
||||
|
||||
def setNum(self, num):
|
||||
|
||||
self.__num = num
|
||||
|
||||
|
||||
|
||||
def getNum(self):
|
||||
|
||||
return self.__num
|
||||
|
||||
|
||||
|
||||
def setClinic(self, clinic):
|
||||
|
||||
self.__clinics = clinic
|
||||
|
||||
|
||||
|
||||
def getClinic(self):
|
||||
|
||||
return self.__clinics
|
||||
|
||||
|
||||
|
||||
class Iterator:
|
||||
|
||||
"迭代器"
|
||||
|
||||
|
||||
|
||||
def __init__(self, data):
|
||||
|
||||
self.__data = data
|
||||
|
||||
self.__curIdx = -1
|
||||
|
||||
|
||||
|
||||
def current(self):
|
||||
|
||||
return self.__data[self.__curIdx] if(len(self.__data) >= self.__curIdx) else None
|
||||
|
||||
|
||||
|
||||
def next(self):
|
||||
|
||||
if (self.__curIdx < len(self.__data) - 1):
|
||||
@@ -649,19 +412,10 @@ class Iterator:
|
||||
else:
|
||||
|
||||
return False
|
||||
|
||||
|
||||
|
||||
class NumeralSystem:
|
||||
|
||||
"排号系统"
|
||||
|
||||
|
||||
|
||||
__clinics = ("1号分诊室", "2号分诊室", "3号分诊室")
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__customers = []
|
||||
@@ -669,9 +423,6 @@ class NumeralSystem:
|
||||
self.__curNum = 0
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def pushCustomer(self, customer):
|
||||
|
||||
customer.setNum(self.__curNum + 1)
|
||||
@@ -687,15 +438,9 @@ class NumeralSystem:
|
||||
print(customer.getName() + "您好!您已在" + self.__name+ "成功挂号,序号:"
|
||||
|
||||
+ str(customer.getNum()).zfill(4) + ",请耐心等待!")
|
||||
|
||||
|
||||
|
||||
def getIterator(self):
|
||||
|
||||
return Iterator(self.__customers)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -719,9 +464,6 @@ class NumeralSystem:
|
||||
tony = Customer("Tony")
|
||||
|
||||
tony.register(numeralSystem)
|
||||
|
||||
|
||||
|
||||
iterator = numeralSystem.getIterator()
|
||||
|
||||
while(iterator.next()):
|
||||
@@ -729,9 +471,6 @@ class NumeralSystem:
|
||||
customer = iterator.current()
|
||||
|
||||
print("下一位病人", str(customer.getNum()).zfill(4), customer.getName(), "请到", customer.getClinic(), "就诊。")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -751,9 +490,6 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
下一位病人 0003 Nick 请到 3号分诊室 就诊。
|
||||
|
||||
下一位病人 0004 Tony 请到 1号分诊室 就诊。
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考迭代器模式</h3>
|
||||
@@ -771,9 +507,6 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
print("下一位病人", str(customer.getNum()).zfill(4), customer.getName(),
|
||||
|
||||
"请到", customer.getClinic(), "就诊。")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>是的,一开始我也思考过这个问题。因为 Python 本身对迭代器的支持非常好,Python 的很多内置对象本身就是可遍历的(iterable),如 List、Tuple、Dictionary 都是可以遍历的。自定义的容器类,只要实现 <code>\__iter\__</code>和<code>\__next\__</code> 两个方法也可以支持 for … in … 的方式进行遍历。</p>
|
||||
@@ -833,33 +566,21 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
<pre><code class="language-python">class Iterator:
|
||||
|
||||
"迭代器"
|
||||
|
||||
|
||||
|
||||
def __init__(self, data):
|
||||
|
||||
self.__data = data
|
||||
|
||||
self.toBegin()
|
||||
|
||||
|
||||
|
||||
def toBegin(self):
|
||||
|
||||
"将指针移至起始位置"
|
||||
|
||||
self.__curIdx = -1
|
||||
|
||||
|
||||
|
||||
def toEnd(self):
|
||||
|
||||
"将指针移至结尾位置"
|
||||
|
||||
self.__curIdx = len(self.__data)
|
||||
|
||||
|
||||
|
||||
def next(self):
|
||||
|
||||
"往前移动一个元素"
|
||||
@@ -873,9 +594,6 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
else:
|
||||
|
||||
return False
|
||||
|
||||
|
||||
|
||||
def previous(self):
|
||||
|
||||
"往后移动一个元素"
|
||||
@@ -889,17 +607,11 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
else:
|
||||
|
||||
return False
|
||||
|
||||
|
||||
|
||||
def current(self):
|
||||
|
||||
"获取当前的元素"
|
||||
|
||||
return self.__data[self.__curIdx] if (len(self.__data) >= self.__curIdx) else None
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -925,9 +637,6 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
tony.register(numeralSystem)
|
||||
|
||||
print()
|
||||
|
||||
|
||||
|
||||
print("从前往后遍历:")
|
||||
|
||||
iterator = numeralSystem.getIterator()
|
||||
@@ -937,9 +646,6 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
customer = iterator.current()
|
||||
|
||||
print("下一位病人", str(customer.getNum()).zfill(4), customer.getName(), "请到", customer.getClinic(), "就诊。")
|
||||
|
||||
|
||||
|
||||
print("从后往前遍历:")
|
||||
|
||||
iterator.toEnd()
|
||||
@@ -949,9 +655,6 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
customer = iterator.current()
|
||||
|
||||
print("下一位病人", str(customer.getNum()).zfill(4), customer.getName(), "请到", customer.getClinic(), "就诊。")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -963,9 +666,6 @@ Pony您好!您已在挂号台成功挂号,序号:0002,请耐心等待!
|
||||
Nick您好!您已在挂号台成功挂号,序号:0003,请耐心等待!
|
||||
|
||||
Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
|
||||
|
||||
|
||||
从前往后遍历:
|
||||
|
||||
下一位病人 0001 Lily 请到 1号分诊室 就诊。
|
||||
@@ -985,9 +685,6 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
下一位病人 0002 Pony 请到 2号分诊室 就诊。
|
||||
|
||||
下一位病人 0001 Lily 请到 1号分诊室 就诊。
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>说明:在这里从后往前遍历本身是没有意义的(医院不可能后来先就诊),只是为了说明迭代器这一功能的实现方式。</p>
|
||||
@@ -1053,9 +750,6 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1063,9 +757,6 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1081,17 +772,11 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1117,9 +802,6 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1131,9 +813,6 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1151,12 +830,6 @@ Tony您好!您已在挂号台成功挂号,序号:0004,请耐心等待!
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 class="current-tab" 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 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">
|
||||
@@ -571,193 +367,106 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class Component:
|
||||
|
||||
"组件,所有子配件的基类"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self._name = name
|
||||
|
||||
|
||||
|
||||
def showInfo(self, indent = ""):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def isComposite(self):
|
||||
|
||||
return False
|
||||
|
||||
|
||||
|
||||
def startup(self, indent = ""):
|
||||
|
||||
print(indent + self._name + " 准备开始工作...")
|
||||
|
||||
|
||||
|
||||
def shutdown(self, indent = ""):
|
||||
|
||||
print(indent + self._name + " 即将结束工作...")
|
||||
|
||||
|
||||
|
||||
class CPU(Component):
|
||||
|
||||
"中央处理器"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def showInfo(self, indent):
|
||||
|
||||
print(indent, end="")
|
||||
|
||||
print("CPU:" + self._name + ",可以进行高速计算。")
|
||||
|
||||
|
||||
|
||||
class MemoryCard(Component):
|
||||
|
||||
"内存条"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def showInfo(self, indent):
|
||||
|
||||
print(indent, end="")
|
||||
|
||||
print("内存:" + self._name + ",可以缓存数据,读写速度快。")
|
||||
|
||||
|
||||
|
||||
class HardDisk(Component):
|
||||
|
||||
"硬盘"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def showInfo(self, indent):
|
||||
|
||||
print(indent, end="")
|
||||
|
||||
print("硬盘:" + self._name + ",可以永久存储数据,容量大。")
|
||||
|
||||
|
||||
|
||||
class GraphicsCard(Component):
|
||||
|
||||
"显卡"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def showInfo(self, indent):
|
||||
|
||||
print(indent, end="")
|
||||
|
||||
print("显卡:" + self._name + ",可以高速计算和处理图形图像。")
|
||||
|
||||
|
||||
|
||||
class Battery(Component):
|
||||
|
||||
"电源"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def showInfo(self, indent):
|
||||
|
||||
print(indent, end="")
|
||||
|
||||
print("电源:" + self._name + ",可以持续给主板和外接配件供电。")
|
||||
|
||||
|
||||
|
||||
class Fan(Component):
|
||||
|
||||
"风扇"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def showInfo(self, indent):
|
||||
|
||||
print(indent, end="")
|
||||
|
||||
print("风扇:" + self._name + ",辅助CPU散热。")
|
||||
|
||||
|
||||
|
||||
class Displayer(Component):
|
||||
|
||||
"显示器"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def showInfo(self, indent):
|
||||
|
||||
print(indent, end="")
|
||||
|
||||
print("显示器:" + self._name + ",负责内容的显示。")
|
||||
|
||||
|
||||
|
||||
class Composite(Component):
|
||||
|
||||
"配件组合器"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
self._components = []
|
||||
|
||||
|
||||
|
||||
def showInfo(self, indent):
|
||||
|
||||
print(self._name + ",由以下部件组成:")
|
||||
@@ -767,27 +476,15 @@ class Composite(Component):
|
||||
for element in self._components:
|
||||
|
||||
element.showInfo(indent)
|
||||
|
||||
|
||||
|
||||
def isComposite(self):
|
||||
|
||||
return True
|
||||
|
||||
|
||||
|
||||
def addComponent(self, component):
|
||||
|
||||
self._components.append(component)
|
||||
|
||||
|
||||
|
||||
def removeComponent(self, component):
|
||||
|
||||
self._components.remove(component)
|
||||
|
||||
|
||||
|
||||
def startup(self, indent):
|
||||
|
||||
super().startup(indent)
|
||||
@@ -797,9 +494,6 @@ class Composite(Component):
|
||||
for element in self._components:
|
||||
|
||||
element.startup(indent)
|
||||
|
||||
|
||||
|
||||
def shutdown(self, indent):
|
||||
|
||||
super().startup(indent)
|
||||
@@ -809,69 +503,39 @@ class Composite(Component):
|
||||
for element in self._components:
|
||||
|
||||
element.shutdown(indent)
|
||||
|
||||
|
||||
|
||||
class Mainboard(Composite):
|
||||
|
||||
"主板"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def showInfo(self, indent):
|
||||
|
||||
print(indent + "主板:", end="")
|
||||
|
||||
super().showInfo(indent)
|
||||
|
||||
|
||||
|
||||
class ComputerCase(Composite):
|
||||
|
||||
"机箱"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def showInfo(self, indent):
|
||||
|
||||
print(indent + "机箱:", end="")
|
||||
|
||||
super().showInfo(indent)
|
||||
|
||||
|
||||
|
||||
class Computer(Composite):
|
||||
|
||||
"电脑"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
super().__init__(name)
|
||||
|
||||
|
||||
|
||||
def showInfo(self, indent):
|
||||
|
||||
print(indent + "电脑:", end="")
|
||||
|
||||
super().showInfo(indent)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -895,9 +559,6 @@ class Computer(Composite):
|
||||
mainBoard.addComponent(hardDisk)
|
||||
|
||||
mainBoard.addComponent(graphicsCard)
|
||||
|
||||
|
||||
|
||||
battery = Battery("Antec VP 450P")
|
||||
|
||||
fan = Fan("DEEPCOOL 120T")
|
||||
@@ -909,21 +570,12 @@ class Computer(Composite):
|
||||
computerCase.addComponent(mainBoard)
|
||||
|
||||
computerCase.addComponent(fan)
|
||||
|
||||
|
||||
|
||||
displayer = Displayer("AOC LV243XIP")
|
||||
|
||||
|
||||
|
||||
computer = Computer("Tony DIY电脑")
|
||||
|
||||
computer.addComponent(displayer)
|
||||
|
||||
computer.addComponent(computerCase)
|
||||
|
||||
|
||||
|
||||
computer.showInfo("")
|
||||
|
||||
print("\n开机过程:")
|
||||
@@ -933,9 +585,6 @@ class Computer(Composite):
|
||||
print("\n关机过程:")
|
||||
|
||||
computer.shutdown("")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -959,9 +608,6 @@ class Computer(Composite):
|
||||
显卡:Colorful iGame750,可以高速计算和处理图形图像。
|
||||
|
||||
风扇:DEEPCOOL 120T,辅助CPU散热。
|
||||
|
||||
|
||||
|
||||
开机过程:
|
||||
|
||||
Tony DIY电脑 准备开始工作...
|
||||
@@ -983,9 +629,6 @@ Tony DIY电脑 准备开始工作...
|
||||
Colorful iGame750 准备开始工作...
|
||||
|
||||
DEEPCOOL 120T 准备开始工作...
|
||||
|
||||
|
||||
|
||||
关机过程:
|
||||
|
||||
Tony DIY电脑 准备开始工作...
|
||||
@@ -1007,9 +650,6 @@ Tony DIY电脑 准备开始工作...
|
||||
Colorful iGame750 即将结束工作...
|
||||
|
||||
DEEPCOOL 120T 即将结束工作...
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考组合模式</h3>
|
||||
@@ -1087,9 +727,6 @@ Tony DIY电脑 准备开始工作...
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1097,9 +734,6 @@ Tony DIY电脑 准备开始工作...
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1115,17 +749,11 @@ Tony DIY电脑 准备开始工作...
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1151,9 +779,6 @@ Tony DIY电脑 准备开始工作...
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1165,9 +790,6 @@ Tony DIY电脑 准备开始工作...
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1185,12 +807,6 @@ Tony DIY电脑 准备开始工作...
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 class="current-tab" 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 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">
|
||||
@@ -563,9 +359,6 @@ function hide_canvas() {
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -573,9 +366,6 @@ function hide_canvas() {
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -591,17 +381,11 @@ function hide_canvas() {
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -627,9 +411,6 @@ function hide_canvas() {
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -641,9 +422,6 @@ function hide_canvas() {
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -661,12 +439,6 @@ function hide_canvas() {
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 class="current-tab" 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 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">
|
||||
@@ -565,53 +361,29 @@ function hide_canvas() {
|
||||
<p>源码示例:</p>
|
||||
|
||||
<pre><code class="language-python">from copy import copy, deepcopy
|
||||
|
||||
|
||||
|
||||
class Person:
|
||||
|
||||
"人"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, age):
|
||||
|
||||
self.__name = name
|
||||
|
||||
self.__age = age
|
||||
|
||||
|
||||
|
||||
def showMyself(self):
|
||||
|
||||
print("我是" + self.__name + ",年龄" + str(self.__age) + ".")
|
||||
|
||||
|
||||
|
||||
def coding(self):
|
||||
|
||||
print("我是码农,我在Coding改变世界...")
|
||||
|
||||
|
||||
|
||||
def reading(self):
|
||||
|
||||
print("阅读使我快乐!知识使我成长!如饥似渴地阅读是生活的一部分...")
|
||||
|
||||
|
||||
|
||||
def fallInLove(self):
|
||||
|
||||
print("春风吹,月亮明,花前月下好相约...")
|
||||
|
||||
|
||||
|
||||
def clone(self):
|
||||
|
||||
return copy(self)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -623,25 +395,16 @@ class Person:
|
||||
tony.showMyself()
|
||||
|
||||
tony.coding()
|
||||
|
||||
|
||||
|
||||
tony1 = tony.clone()
|
||||
|
||||
tony1.showMyself()
|
||||
|
||||
tony1.reading()
|
||||
|
||||
|
||||
|
||||
tony2 = tony.clone()
|
||||
|
||||
tony2.showMyself()
|
||||
|
||||
tony2.fallInLove()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -657,9 +420,6 @@ class Person:
|
||||
我是Tony,年龄:26
|
||||
|
||||
春风吹,月亮明,花前月下好相约...
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>在上面的例子中,Tony 克隆出了两个自己 tony1 和 tony2,因为是克隆出来的,所有姓名和年龄都一样,这样 Tony 就可以同时去敲代码、读书和约会了。</p>
|
||||
@@ -685,9 +445,6 @@ class Person:
|
||||
<pre><code class="language-python">class Person:
|
||||
|
||||
"人"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, age):
|
||||
|
||||
self.__name = name
|
||||
@@ -695,9 +452,6 @@ class Person:
|
||||
self.__age = age
|
||||
|
||||
self.__petList = []
|
||||
|
||||
|
||||
|
||||
def showMyself(self):
|
||||
|
||||
print("我是" + self.__name + ",年龄" + str(self.__age) + ". 我养了这些宠物:")
|
||||
@@ -707,27 +461,15 @@ class Person:
|
||||
print(pet + "\t", end="")
|
||||
|
||||
print()
|
||||
|
||||
|
||||
|
||||
def addPet(self, pet):
|
||||
|
||||
self.__petList.append(pet)
|
||||
|
||||
|
||||
|
||||
def clone(self):
|
||||
|
||||
return copy(self)
|
||||
|
||||
|
||||
|
||||
def deepClone(self):
|
||||
|
||||
return deepcopy(self)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -741,9 +483,6 @@ class Person:
|
||||
print("父本tony:", end="")
|
||||
|
||||
tony.showMyself()
|
||||
|
||||
|
||||
|
||||
tony1 = tony.deepClone()
|
||||
|
||||
tony1.addPet("小猫Amy")
|
||||
@@ -755,9 +494,6 @@ class Person:
|
||||
print("父本tony:", end="")
|
||||
|
||||
tony.showMyself()
|
||||
|
||||
|
||||
|
||||
tony2 = tony.clone()
|
||||
|
||||
tony2.addPet("小兔Ricky")
|
||||
@@ -769,9 +505,6 @@ class Person:
|
||||
print("父本tony:", end="")
|
||||
|
||||
tony.showMyself()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -795,9 +528,6 @@ class Person:
|
||||
父本tony:我是Tony,年龄26. 我养了这些宠物:
|
||||
|
||||
小狗Coco 小兔Ricky
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>在上面这个例子中,我们看到“副本 tony1”是通过深拷贝的方式创建的,我们对 tony1 对象增加宠物,不会影响 tony 对象。而副本 tony2 是通过浅拷贝的方式创建的,我们对 tony2 对象增加宠物时,tony 对象也更着改变。这是因为 Person 类<code>__petList</code>成员是一个可变的引用类型,<strong>浅拷贝只拷贝引用类型对象的指针(指向),而不拷贝引用类型对象指向的值;深拷贝到同时拷贝引用类型对象及其指向的值。</strong></p>
|
||||
@@ -827,9 +557,6 @@ class Person:
|
||||
print("list:", list)
|
||||
|
||||
print("list1:", list1)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>结果:</p>
|
||||
@@ -849,9 +576,6 @@ list1: [1, 2, 3]
|
||||
list: [1, 2, 3, 4]
|
||||
|
||||
list1: [1, 2, 3, 4]
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>通过 Clone 的方式创建对象时,浅拷贝往往是很危险的,因为一个对象的改变另一个对象也同时改变。深拷贝会对一个对象的发生进行完全拷贝,这样两个对象之间就不会相互影响了,你改你的,我改我的。</p>
|
||||
@@ -865,31 +589,19 @@ list1: [1, 2, 3, 4]
|
||||
<p>克隆模式非常简单,我们可以对它进行进一步的重构和优化,抽象出克隆模式的框架模型。</p>
|
||||
|
||||
<pre><code class="language-python">from copy import copy, deepcopy
|
||||
|
||||
|
||||
|
||||
class Clone:
|
||||
|
||||
"克隆的基类"
|
||||
|
||||
|
||||
|
||||
def clone(self):
|
||||
|
||||
"浅拷贝的方式克隆对象"
|
||||
|
||||
return copy(self)
|
||||
|
||||
|
||||
|
||||
def deepClone(self):
|
||||
|
||||
"深拷贝的方式克隆对象"
|
||||
|
||||
return deepcopy(self)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h4>类图</h4>
|
||||
@@ -905,9 +617,6 @@ class Clone:
|
||||
<pre><code class="language-python">class Person(Clone):
|
||||
|
||||
"人"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, age):
|
||||
|
||||
self.__name = name
|
||||
@@ -915,9 +624,6 @@ class Clone:
|
||||
self.__age = age
|
||||
|
||||
self.__petList = []
|
||||
|
||||
|
||||
|
||||
def showMyself(self):
|
||||
|
||||
print("我是" + self.__name + ",年龄" + str(self.__age) + ". 我养了这些宠物:")
|
||||
@@ -927,33 +633,18 @@ class Clone:
|
||||
print(pet + "\t", end="")
|
||||
|
||||
print()
|
||||
|
||||
|
||||
|
||||
def addPet(self, pet):
|
||||
|
||||
self.__petList.append(pet)
|
||||
|
||||
|
||||
|
||||
def coding(self):
|
||||
|
||||
print("我是码农,我在Coding改变世界...")
|
||||
|
||||
|
||||
|
||||
def reading(self):
|
||||
|
||||
print("阅读使我快乐!知识使我成长!如饥似渴地阅读是生活的一部分...")
|
||||
|
||||
|
||||
|
||||
def fallInLove(self):
|
||||
|
||||
print("春风吹,月亮明,花前月下好相约...")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码不用变(同 testProtoType2()),自己跑一下,会发现输出结果和之前的是一样的。</p>
|
||||
@@ -1005,9 +696,6 @@ class Clone:
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1015,9 +703,6 @@ class Clone:
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1033,17 +718,11 @@ class Clone:
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1069,9 +748,6 @@ class Clone:
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1083,9 +759,6 @@ class Clone:
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1103,12 +776,6 @@ class Clone:
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 class="current-tab" href="/专栏/白话设计模式 28 讲(完)/14 策略模式:怎么来不重要,人到就行.md.html">14 策略模式:怎么来不重要,人到就行.md.html</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/15 命令模式:大闸蟹,走起!.md.html">15 命令模式:大闸蟹,走起!.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a 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">
|
||||
@@ -579,77 +375,41 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class IVehicle:
|
||||
|
||||
"交通工具的抽象类"
|
||||
|
||||
|
||||
|
||||
def running(self):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class SharedBicycle(IVehicle):
|
||||
|
||||
"共享单车"
|
||||
|
||||
|
||||
|
||||
def running(self):
|
||||
|
||||
print("骑共享单车(轻快便捷)", end='')
|
||||
|
||||
|
||||
|
||||
class ExpressBus(IVehicle):
|
||||
|
||||
"快速公交"
|
||||
|
||||
|
||||
|
||||
def running(self):
|
||||
|
||||
print("坐快速公交(经济绿色)", end='')
|
||||
|
||||
|
||||
|
||||
class Express(IVehicle):
|
||||
|
||||
"快车"
|
||||
|
||||
|
||||
|
||||
def running(self):
|
||||
|
||||
print("打快车(快速方便)", end='')
|
||||
|
||||
|
||||
|
||||
class Subway(IVehicle):
|
||||
|
||||
"地铁"
|
||||
|
||||
|
||||
|
||||
def running(self):
|
||||
|
||||
print("坐地铁(高效安全)", end='')
|
||||
|
||||
|
||||
|
||||
class Classmate:
|
||||
|
||||
"参加聚餐的同学"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, vechicle):
|
||||
|
||||
self.__name = name
|
||||
|
||||
self.__vechicle = vechicle
|
||||
|
||||
|
||||
|
||||
def attendTheDinner(self):
|
||||
|
||||
print(self.__name + " ", end='')
|
||||
@@ -657,9 +417,6 @@ class Classmate:
|
||||
self.__vechicle.running()
|
||||
|
||||
print(" 来参加聚餐!")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -683,9 +440,6 @@ class Classmate:
|
||||
ruby = Classmate("Ruby", Express())
|
||||
|
||||
ruby.attendTheDinner()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -697,9 +451,6 @@ Helen 坐地铁(高效安全) 来参加聚餐!
|
||||
Henry 坐快速公交(经济绿色) 来参加聚餐!
|
||||
|
||||
Ruby 打快车(快速方便) 来参加聚餐!
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>上面示例的类图如下:</p>
|
||||
@@ -729,9 +480,6 @@ Ruby 打快车(快速方便) 来参加聚餐!
|
||||
henry = Classmate("Henry", Express())
|
||||
|
||||
henry.attendTheDinner()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>策略模式的模型抽象</h3>
|
||||
@@ -795,9 +543,6 @@ henry.attendTheDinner()
|
||||
<pre><code class="language-python">class Person:
|
||||
|
||||
"人类"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, age, weight, height):
|
||||
|
||||
self.name = name
|
||||
@@ -807,65 +552,35 @@ henry.attendTheDinner()
|
||||
self.weight = weight
|
||||
|
||||
self.height = height
|
||||
|
||||
|
||||
|
||||
def showMysef(self):
|
||||
|
||||
print(self.name + " " + str(self.age) + " years old, " + str(self.weight) + "kg, " + str(self.height) + "m.")
|
||||
|
||||
|
||||
|
||||
class ICompare:
|
||||
|
||||
"比较算法"
|
||||
|
||||
|
||||
|
||||
def comparable(self, person1, person2):
|
||||
|
||||
"person1 > person2 返回值>0,person1 == person2 返回0, person1 < person2 返回值小于0"
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class CompareByAge(ICompare):
|
||||
|
||||
"通过年龄排序"
|
||||
|
||||
|
||||
|
||||
def comparable(self, person1, person2):
|
||||
|
||||
return person1.age - person2.age
|
||||
|
||||
|
||||
|
||||
class CompareByHeight(ICompare):
|
||||
|
||||
"通过身高进行排序"
|
||||
|
||||
|
||||
|
||||
def comparable(self, person1, person2):
|
||||
|
||||
return person1.height - person2.height
|
||||
|
||||
|
||||
|
||||
class SortPerson:
|
||||
|
||||
"Person的排序类"
|
||||
|
||||
|
||||
|
||||
def __init__(self, compare):
|
||||
|
||||
self.__compare = compare
|
||||
|
||||
|
||||
|
||||
def sort(self, personList):
|
||||
|
||||
"排序算法,这里采用最简单的冒泡排序"
|
||||
@@ -887,9 +602,6 @@ class SortPerson:
|
||||
j += 1
|
||||
|
||||
i += 1
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p><strong>测试代码:</strong></p>
|
||||
@@ -921,9 +633,6 @@ class SortPerson:
|
||||
person.showMysef()
|
||||
|
||||
print()
|
||||
|
||||
|
||||
|
||||
sorter1 = SortPerson(CompareByHeight())
|
||||
|
||||
sorter1.sort(personList)
|
||||
@@ -933,9 +642,6 @@ class SortPerson:
|
||||
for person in personList:
|
||||
|
||||
person.showMysef()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p><strong>输出结果:</strong></p>
|
||||
@@ -951,9 +657,6 @@ Eric 23 years old, 62.0kg, 1.78m.
|
||||
Jack 31 years old, 74.5kg, 1.8m.
|
||||
|
||||
Nick 54 years old, 44.5kg, 1.59m.
|
||||
|
||||
|
||||
|
||||
根据身高进行排序后的结果:
|
||||
|
||||
Tony 2 years old, 54.5kg, 0.82m.
|
||||
@@ -965,9 +668,6 @@ Helen 16 years old, 45.7kg, 1.6m.
|
||||
Eric 23 years old, 62.0kg, 1.78m.
|
||||
|
||||
Jack 31 years old, 74.5kg, 1.8m.
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>上面的代码可用类图表示如下:</p>
|
||||
@@ -977,15 +677,9 @@ Jack 31 years old, 74.5kg, 1.8m.
|
||||
<p>看到这,熟悉 Python 的读者肯定要吐槽了!Python 是一个简洁明了的语言,使用十几行代码就能解决的问题(如下面的实现代码),为什么要写上面这一大堆的东西。</p>
|
||||
|
||||
<pre><code class="language-python">from operator import itemgetter,attrgetter
|
||||
|
||||
|
||||
|
||||
def testPersonListInPython():
|
||||
|
||||
"用Python的方式对Person进行排序"
|
||||
|
||||
|
||||
|
||||
personList = [
|
||||
|
||||
Person("Tony", 2, 54.5, 0.82),
|
||||
@@ -999,9 +693,6 @@ def testPersonListInPython():
|
||||
Person("Helen", 16, 45.7, 1.60)
|
||||
|
||||
]
|
||||
|
||||
|
||||
|
||||
# 使用使用operator模块根据年龄进行排序
|
||||
|
||||
print("根据年龄进行排序后的结果:")
|
||||
@@ -1013,9 +704,6 @@ def testPersonListInPython():
|
||||
person.showMysef()
|
||||
|
||||
print()
|
||||
|
||||
|
||||
|
||||
print("根据身高进行排序后的结果:")
|
||||
|
||||
sortedPerons1 = sorted(personList, key=attrgetter('height'))
|
||||
@@ -1023,9 +711,6 @@ def testPersonListInPython():
|
||||
for person in sortedPerons1:
|
||||
|
||||
person.showMysef()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出的结果和上面是一模一样的,这里不再赘述。</p>
|
||||
@@ -1045,9 +730,6 @@ def testPersonListInPython():
|
||||
<pre><code class="language-python">class CompareByHeightAndWeight(ICompare):
|
||||
|
||||
"根据身高和体重的综合情况来排序(身高和体重的权重分别是0.6和0.4)"
|
||||
|
||||
|
||||
|
||||
def comparable(self, person1, person2):
|
||||
|
||||
value1 = person1.height * 0.6 + person1.weight * 0.4
|
||||
@@ -1055,9 +737,6 @@ def testPersonListInPython():
|
||||
value2 = person2.height * 0.6 + person2.weight * 0.4
|
||||
|
||||
return value1 - value2
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>应用场景</h3>
|
||||
@@ -1091,9 +770,6 @@ def testPersonListInPython():
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1101,9 +777,6 @@ def testPersonListInPython():
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1119,17 +792,11 @@ def testPersonListInPython():
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1155,9 +822,6 @@ def testPersonListInPython():
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1169,9 +833,6 @@ def testPersonListInPython():
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1189,12 +850,6 @@ def testPersonListInPython():
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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>
|
||||
|
||||
|
||||
@@ -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 href="/专栏/白话设计模式 28 讲(完)/16 备忘模式:好记性不如烂笔头.md.html">16 备忘模式:好记性不如烂笔头.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
<a class="current-tab" 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">
|
||||
@@ -565,49 +361,28 @@ function hide_canvas() {
|
||||
<p>源码示例:</p>
|
||||
|
||||
<pre><code class="language-python">import logging
|
||||
|
||||
|
||||
|
||||
class Pigment:
|
||||
|
||||
"颜料"
|
||||
|
||||
|
||||
|
||||
def __init__(self, color):
|
||||
|
||||
self.__color = color
|
||||
|
||||
self.__user = ""
|
||||
|
||||
|
||||
|
||||
def getColor(self):
|
||||
|
||||
return self.__color
|
||||
|
||||
|
||||
|
||||
def setUser(self, user):
|
||||
|
||||
self.__user = user
|
||||
|
||||
return self
|
||||
|
||||
|
||||
|
||||
def showInfo(self):
|
||||
|
||||
print(self.__user + "取得" + self.__color + "色颜料")
|
||||
|
||||
|
||||
|
||||
class PigmengFactory:
|
||||
|
||||
"资料的工厂类"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__sigmentSet = {
|
||||
@@ -623,9 +398,6 @@ class PigmengFactory:
|
||||
"紫": Pigment("紫"),
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
def getPigment(self, color):
|
||||
|
||||
pigment = self.__sigmentSet.get(color)
|
||||
@@ -635,9 +407,6 @@ class PigmengFactory:
|
||||
logging.error("没有%s颜色的颜料!", color)
|
||||
|
||||
return pigment
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -661,9 +430,6 @@ class PigmengFactory:
|
||||
pigmentBlue2 = factory.getPigment("蓝").setUser("和平队")
|
||||
|
||||
pigmentBlue2.showInfo()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -675,9 +441,6 @@ class PigmengFactory:
|
||||
梦之队取得蓝色颜料
|
||||
|
||||
和平队取得蓝色颜料
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考享元模式</h3>
|
||||
@@ -723,53 +486,29 @@ class PigmengFactory:
|
||||
<pre><code class="language-python">from abc import ABCMeta, abstractmethod
|
||||
|
||||
# 引入ABCMeta和abstractmethod来定义抽象类和抽象方法
|
||||
|
||||
|
||||
|
||||
class Flyweight(metaclass=ABCMeta):
|
||||
|
||||
"享元类"
|
||||
|
||||
|
||||
|
||||
@abstractmethod
|
||||
|
||||
def operation(self, extrinsicState):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class FlyweightImpl(Flyweight):
|
||||
|
||||
"享元类的具体实现类"
|
||||
|
||||
|
||||
|
||||
def __init__(self, color):
|
||||
|
||||
self.__color = color
|
||||
|
||||
|
||||
|
||||
def operation(self, extrinsicState):
|
||||
|
||||
print(extrinsicState + "取得" + self.__color + "色颜料")
|
||||
|
||||
|
||||
|
||||
class FlyweightFactory:
|
||||
|
||||
"享元工厂"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__flyweights = {}
|
||||
|
||||
|
||||
|
||||
def getFlyweight(self, key):
|
||||
|
||||
pigment = self.__flyweights.get(key)
|
||||
@@ -779,9 +518,6 @@ class FlyweightFactory:
|
||||
pigment = FlyweightImpl(key)
|
||||
|
||||
return pigment
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p><strong>测试代码:</strong></p>
|
||||
@@ -805,9 +541,6 @@ class FlyweightFactory:
|
||||
pigmentBlue2 = factory.getFlyweight("蓝")
|
||||
|
||||
pigmentBlue2.operation("和平队")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>自己跑一下,会发现输出结果和之前的是一样的。</p>
|
||||
@@ -895,9 +628,6 @@ class FlyweightFactory:
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -905,9 +635,6 @@ class FlyweightFactory:
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -923,17 +650,11 @@ class FlyweightFactory:
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -959,9 +680,6 @@ class FlyweightFactory:
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -973,9 +691,6 @@ class FlyweightFactory:
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -993,12 +708,6 @@ class FlyweightFactory:
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 href="/专栏/白话设计模式 28 讲(完)/16 备忘模式:好记性不如烂笔头.md.html">16 备忘模式:好记性不如烂笔头.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a href="/专栏/白话设计模式 28 讲(完)/17 享元模式:颜料很贵必须充分利用.md.html">17 享元模式:颜料很贵必须充分利用.md.html</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
|
||||
|
||||
<a class="current-tab" 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">
|
||||
@@ -581,57 +377,30 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class Register:
|
||||
|
||||
"入学报到"
|
||||
|
||||
|
||||
|
||||
def register(self, name):
|
||||
|
||||
print("活动中心:" + name + "同学报到成功!")
|
||||
|
||||
|
||||
|
||||
class Payment:
|
||||
|
||||
"缴费"
|
||||
|
||||
|
||||
|
||||
def pay(self, name, money):
|
||||
|
||||
print("缴费中心:" + "收到" + name + "同学" + str(money) + "元付款,缴费成功!")
|
||||
|
||||
|
||||
|
||||
class DormitoryManagementCenter:
|
||||
|
||||
"宿舍管理中心(生活中心)"
|
||||
|
||||
|
||||
|
||||
def provideLivingGoods(self, name):
|
||||
|
||||
print("生活中心:" + name + "同学的生活用品已发放。")
|
||||
|
||||
|
||||
|
||||
class Dormitory:
|
||||
|
||||
"宿舍"
|
||||
|
||||
|
||||
|
||||
def meetRoommate(self, name):
|
||||
|
||||
print("宿 舍:" + "大家好!这是刚来的" + name + "同学,是你们未来需要共度四年的室友!相互认识一下……")
|
||||
|
||||
|
||||
|
||||
class Volunteer:
|
||||
|
||||
"迎新志愿者"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
@@ -643,9 +412,6 @@ class Volunteer:
|
||||
self.__lifeCenter = DormitoryManagementCenter()
|
||||
|
||||
self.__dormintory = Dormitory()
|
||||
|
||||
|
||||
|
||||
def welcomeFreshmen(self, name):
|
||||
|
||||
print("你好," + name + "同学! 我是新生报到的志愿者" + self.__name
|
||||
@@ -659,9 +425,6 @@ class Volunteer:
|
||||
self.__lifeCenter.provideLivingGoods(name)
|
||||
|
||||
self.__dormintory.meetRoommate(name)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -671,9 +434,6 @@ class Volunteer:
|
||||
volunteer = Volunteer("Frank")
|
||||
|
||||
volunteer.welcomeFreshmen("Tony")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -687,9 +447,6 @@ class Volunteer:
|
||||
生活中心:Tony同学的生活用品已发放。
|
||||
|
||||
宿 舍:大家好!这是刚来的Tony同学,是你们未来需要共度四年的室友!相互认识一下……
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考外观模式</h3>
|
||||
@@ -769,81 +526,48 @@ class Volunteer:
|
||||
<pre><code class="language-python">from os import path
|
||||
|
||||
import logging
|
||||
|
||||
|
||||
|
||||
class ZIPModel:
|
||||
|
||||
"ZIP模块,负责ZIP文件的压缩与解压"
|
||||
|
||||
|
||||
|
||||
def compress(self, srcFilePath, dstFilePath):
|
||||
|
||||
print("ZIP模块正在进行 '" + srcFilePath + "' 文件的压缩......")
|
||||
|
||||
print("文件压缩成功,已保存至 '" + dstFilePath + "'")
|
||||
|
||||
|
||||
|
||||
def decompress(self, srcFilePath, dstFilePath):
|
||||
|
||||
print("ZIP模块正在进行 '" + srcFilePath + "' 文件的解压......")
|
||||
|
||||
print("文件解压成功,已保存至 '" + dstFilePath+ "'")
|
||||
|
||||
|
||||
|
||||
class RARModel:
|
||||
|
||||
"RAR模块,负责ZIP文件的压缩与解压"
|
||||
|
||||
|
||||
|
||||
def compress(self, srcFilePath, dstFilePath):
|
||||
|
||||
print("RAR模块正在进行 '" + srcFilePath + "' 文件的压缩......")
|
||||
|
||||
print("文件压缩成功,已保存至 '" + dstFilePath + "'")
|
||||
|
||||
|
||||
|
||||
def decompress(self, srcFilePath, dstFilePath):
|
||||
|
||||
print("RAR模块正在进行 '" + srcFilePath + "' 文件的解压......")
|
||||
|
||||
print("文件解压成功,已保存至 '" + dstFilePath + "'")
|
||||
|
||||
|
||||
|
||||
class ZModel:
|
||||
|
||||
"7Z模块,负责7Z文件的压缩与解压"
|
||||
|
||||
|
||||
|
||||
def compress(self, srcFilePath, dstFilePath):
|
||||
|
||||
print("7Z模块正在进行 '" + srcFilePath + "' 文件的压缩......")
|
||||
|
||||
print("文件压缩成功,已保存至 '" + dstFilePath + "'")
|
||||
|
||||
|
||||
|
||||
def decompress(self, srcFilePath, dstFilePath):
|
||||
|
||||
print("7Z模块正在进行 '" + srcFilePath + "' 文件的解压......")
|
||||
|
||||
print("文件解压成功,已保存至 '" + dstFilePath + "'")
|
||||
|
||||
|
||||
|
||||
class CompressionFacade:
|
||||
|
||||
"压缩系统的外观类"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__zipModel = ZIPModel()
|
||||
@@ -851,9 +575,6 @@ class CompressionFacade:
|
||||
self.__rarModel = RARModel()
|
||||
|
||||
self.__zModel = ZModel()
|
||||
|
||||
|
||||
|
||||
def compress(self, srcFilePath, dstFilePath, type):
|
||||
|
||||
"根据不同的压缩类型,压缩成不同的格式"
|
||||
@@ -883,9 +604,6 @@ class CompressionFacade:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
|
||||
def decompress(self, srcFilePath, dstFilePath):
|
||||
|
||||
"从srcFilePath中获取后缀,根据不同的后缀名(拓展名),进行不同格式的解压"
|
||||
@@ -913,9 +631,6 @@ class CompressionFacade:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p><strong>测试代码:</strong></p>
|
||||
@@ -933,9 +648,6 @@ class CompressionFacade:
|
||||
"E:\解析文件\生活中的外观模式——学妹别慌,学长帮你.md")
|
||||
|
||||
print()
|
||||
|
||||
|
||||
|
||||
facade.compress("E:\生活中的设计模式\生活中的外观模式——学妹别慌,学长帮你.md",
|
||||
|
||||
"E:\压缩文件\生活中的外观模式——学妹别慌,学长帮你", "rar")
|
||||
@@ -945,9 +657,6 @@ class CompressionFacade:
|
||||
"E:\解析文件\生活中的外观模式——学妹别慌,学长帮你.md")
|
||||
|
||||
print()
|
||||
|
||||
|
||||
|
||||
facade.compress("E:\生活中的设计模式\生活中的外观模式——学妹别慌,学长帮你.md",
|
||||
|
||||
"E:\压缩文件\生活中的外观模式——学妹别慌,学长帮你", "7z")
|
||||
@@ -957,9 +666,6 @@ class CompressionFacade:
|
||||
"E:\解析文件\生活中的外观模式——学妹别慌,学长帮你.md")
|
||||
|
||||
print()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p><strong>输出结果:</strong></p>
|
||||
@@ -971,9 +677,6 @@ class CompressionFacade:
|
||||
ZIP模块正在进行 'E:\压缩文件\生活中的外观模式——学妹别慌,学长帮你.zip' 文件的解压......
|
||||
|
||||
文件解压成功,已保存至 'E:\解析文件\生活中的外观模式——学妹别慌,学长帮你.md'
|
||||
|
||||
|
||||
|
||||
RAR模块正在进行 'E:\生活中的设计模式\生活中的外观模式——学妹别慌,学长帮你.md' 文件的压缩......
|
||||
|
||||
文件压缩成功,已保存至 'E:\压缩文件\生活中的外观模式——学妹别慌,学长帮你.rar'
|
||||
@@ -981,9 +684,6 @@ RAR模块正在进行 'E:\生活中的设计模式\生活中的外观模式—
|
||||
RAR模块正在进行 'E:\压缩文件\生活中的外观模式——学妹别慌,学长帮你.rar' 文件的解压......
|
||||
|
||||
文件解压成功,已保存至 'E:\解析文件\生活中的外观模式——学妹别慌,学长帮你.md'
|
||||
|
||||
|
||||
|
||||
7Z模块正在进行 'E:\生活中的设计模式\生活中的外观模式——学妹别慌,学长帮你.md' 文件的压缩......
|
||||
|
||||
文件压缩成功,已保存至 'E:\压缩文件\生活中的外观模式——学妹别慌,学长帮你.7z'
|
||||
@@ -991,9 +691,6 @@ RAR模块正在进行 'E:\压缩文件\生活中的外观模式——学妹别
|
||||
7Z模块正在进行 'E:\压缩文件\生活中的外观模式——学妹别慌,学长帮你.7z' 文件的解压......
|
||||
|
||||
文件解压成功,已保存至 'E:\解析文件\生活中的外观模式——学妹别慌,学长帮你.md'
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>在上面的例子中,为了简单起见,我们通过后缀名(拓展名)来区分不同的文件格式,不同的文件格式采用不同的解压方式来进行解压。在实际的项目开发中,不应该通过文件后缀名来区分文件格式,因为用户可能将一个 RAR 格式的文件改成 .zip 的后缀,这会造成解压的错误;而应该通过文件的魔数来判断,每一种格式的文件,在二进制文件的开头都会有一个魔数来说明该文件的类型(可通过二进制文件工具查看,如 WinHex),如 ZIP 的魔数是 PK(50 4B 03 04),RAR 的魔数是 Rar(52 61 72),7z 的魔数是 7z(37 7A)。</p>
|
||||
@@ -1029,9 +726,6 @@ RAR模块正在进行 'E:\压缩文件\生活中的外观模式——学妹别
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1039,9 +733,6 @@ RAR模块正在进行 'E:\压缩文件\生活中的外观模式——学妹别
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1057,17 +748,11 @@ RAR模块正在进行 'E:\压缩文件\生活中的外观模式——学妹别
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1093,9 +778,6 @@ RAR模块正在进行 'E:\压缩文件\生活中的外观模式——学妹别
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1107,9 +789,6 @@ RAR模块正在进行 'E:\压缩文件\生活中的外观模式——学妹别
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1127,12 +806,6 @@ RAR模块正在进行 'E:\压缩文件\生活中的外观模式——学妹别
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 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 class="current-tab" 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,9 +363,6 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">from abc import ABCMeta, abstractmethod
|
||||
|
||||
# 引入ABCMeta和abstractmethod来定义抽象类和抽象方法
|
||||
|
||||
|
||||
|
||||
class DesignPatternBook:
|
||||
|
||||
"《从生活的角度解读设计模式》一书"
|
||||
@@ -577,57 +370,30 @@ class DesignPatternBook:
|
||||
def getName(self):
|
||||
|
||||
return "《从生活的角度解读设计模式》"
|
||||
|
||||
|
||||
|
||||
class Reader(metaclass=ABCMeta):
|
||||
|
||||
"访问者,也就是读者"
|
||||
|
||||
|
||||
|
||||
@abstractmethod
|
||||
|
||||
def read(self, book):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class Engineer(Reader):
|
||||
|
||||
|
||||
|
||||
def read(self, book):
|
||||
|
||||
print("技术狗读" + book.getName() + "一书后的感受:能抓住模式的核心思想,深入浅出,很有见地!")
|
||||
|
||||
|
||||
|
||||
class ProductManager(Reader):
|
||||
|
||||
"产品经理"
|
||||
|
||||
|
||||
|
||||
def read(self, book):
|
||||
|
||||
print("产品经理读" + book.getName() + "一书后的感受:配图非常有趣,文章很有层次感!")
|
||||
|
||||
|
||||
|
||||
class OtherFriend(Reader):
|
||||
|
||||
"IT圈外的朋友"
|
||||
|
||||
|
||||
|
||||
def read(self, book):
|
||||
|
||||
print("IT圈外的朋友读" + book.getName() + "一书后的感受:技术的内容一脸蒙蔽,但故事很精彩,像是看小说或是故事集!")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -641,9 +407,6 @@ class OtherFriend(Reader):
|
||||
for fan in fans:
|
||||
|
||||
fan.read(book)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -653,9 +416,6 @@ class OtherFriend(Reader):
|
||||
产品经理读《从生活的角度解读设计模式》一书后的感受:配图非常有趣,文章很有层次感!
|
||||
|
||||
IT 圈外的朋友读《从生活的角度解读设计模式》一书后的感受:技术的内容一脸蒙蔽,但故事很精彩,像是看小说或是故事集!
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考访问模式</h3>
|
||||
@@ -683,29 +443,17 @@ IT 圈外的朋友读《从生活的角度解读设计模式》一书后的感
|
||||
<pre><code class="language-python">from abc import ABCMeta, abstractmethod
|
||||
|
||||
# 引入ABCMeta和abstractmethod来定义抽象类和抽象方法
|
||||
|
||||
|
||||
|
||||
class DataNode(metaclass=ABCMeta):
|
||||
|
||||
"数据结构类"
|
||||
|
||||
|
||||
|
||||
def accept(self, visitor):
|
||||
|
||||
"接受访问者的访问"
|
||||
|
||||
visitor.visit(self)
|
||||
|
||||
|
||||
|
||||
class Visitor(metaclass=ABCMeta):
|
||||
|
||||
"访问者"
|
||||
|
||||
|
||||
|
||||
@abstractmethod
|
||||
|
||||
def visit(self, data):
|
||||
@@ -713,27 +461,15 @@ class Visitor(metaclass=ABCMeta):
|
||||
"对数据对象的访问操作"
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class ObjectStructure:
|
||||
|
||||
"数据结构的管理类,也是数据对象的一个容器,可遍历容器内的所有元素"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__datas = []
|
||||
|
||||
|
||||
|
||||
def add(self, dataElement):
|
||||
|
||||
self.__datas.append(dataElement)
|
||||
|
||||
|
||||
|
||||
def action(self, visitor):
|
||||
|
||||
"进行数据访问的操作"
|
||||
@@ -741,9 +477,6 @@ class ObjectStructure:
|
||||
for data in self.__datas:
|
||||
|
||||
visitor.visit(data)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>这里 Visitor 的访问方法只有一个 visit(),是因为 Python 不支持方法的重载。在一些强类型的语言(如 Java、C++)中,应该有多个方法,针对每一个 DataNode 子类定义一个重载方法。</p>
|
||||
@@ -763,49 +496,25 @@ class ObjectStructure:
|
||||
<pre><code class="language-python">class DesignPatternBook:
|
||||
|
||||
"《从生活的角度解读设计模式》一书"
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return "《从生活的角度解读设计模式》"
|
||||
|
||||
|
||||
|
||||
class Engineer(Visitor):
|
||||
|
||||
|
||||
|
||||
def visit(self, book):
|
||||
|
||||
print("技术狗读" + book.getName() + "一书后的感受:能抓住模式的核心思想,深入浅出,很有见地!")
|
||||
|
||||
|
||||
|
||||
class ProductManager(Visitor):
|
||||
|
||||
"产品经理"
|
||||
|
||||
|
||||
|
||||
def visit(self, book):
|
||||
|
||||
print("产品经理读" + book.getName() + "一书后的感受:配图非常有趣,文章很有层次感!")
|
||||
|
||||
|
||||
|
||||
class OtherFriend(Visitor):
|
||||
|
||||
"IT圈外的朋友"
|
||||
|
||||
|
||||
|
||||
def visit(self, book):
|
||||
|
||||
print("IT圈外的朋友读" + book.getName() + "一书后的感受:技术的内容一脸蒙蔽,但故事很精彩,像是看小说或是故事集!")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码也得相应改动一下:</p>
|
||||
@@ -823,9 +532,6 @@ class OtherFriend(Visitor):
|
||||
objMgr.action(ProductManager())
|
||||
|
||||
objMgr.action(OtherFriend())
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>自己跑一下,会发现输出结果和之前的是一样的。</p>
|
||||
@@ -889,9 +595,6 @@ class OtherFriend(Visitor):
|
||||
<pre><code class="language-python">class Animal(DataNode):
|
||||
|
||||
"动物类"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, isMale, age, weight):
|
||||
|
||||
self.__name = name
|
||||
@@ -901,75 +604,39 @@ class OtherFriend(Visitor):
|
||||
self.__age = age
|
||||
|
||||
self.__weight = weight
|
||||
|
||||
|
||||
|
||||
def getName(self):
|
||||
|
||||
return self.__name
|
||||
|
||||
|
||||
|
||||
def isMale(self):
|
||||
|
||||
return self.__isMale
|
||||
|
||||
|
||||
|
||||
def getAge(self):
|
||||
|
||||
return self.__age
|
||||
|
||||
|
||||
|
||||
def getWeight(self):
|
||||
|
||||
return self.__weight
|
||||
|
||||
|
||||
|
||||
class Cat(Animal):
|
||||
|
||||
"猫"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, isMale, age, weight):
|
||||
|
||||
super().__init__(name, isMale, age, weight)
|
||||
|
||||
|
||||
|
||||
def speak(self):
|
||||
|
||||
print("miao~")
|
||||
|
||||
|
||||
|
||||
class Dog(Animal):
|
||||
|
||||
"狗"
|
||||
|
||||
|
||||
|
||||
def __init__(self, name, isMale, age, weight):
|
||||
|
||||
super().__init__( name, isMale, age, weight)
|
||||
|
||||
|
||||
|
||||
def speak(self):
|
||||
|
||||
print("wang~")
|
||||
|
||||
|
||||
|
||||
class GenderCounter(Visitor):
|
||||
|
||||
"性别统计"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__maleCat = 0
|
||||
@@ -979,9 +646,6 @@ class GenderCounter(Visitor):
|
||||
self.__maleDog = 0
|
||||
|
||||
self.__femalDog = 0
|
||||
|
||||
|
||||
|
||||
def visit(self, data):
|
||||
|
||||
if isinstance(data, Cat):
|
||||
@@ -1007,21 +671,12 @@ class GenderCounter(Visitor):
|
||||
else:
|
||||
|
||||
print("Not support this type")
|
||||
|
||||
|
||||
|
||||
def getInfo(self):
|
||||
|
||||
print(str(self.__maleCat) + "只雄猫," + str(self.__femaleCat) + "只雌猫,"
|
||||
|
||||
+ str(self.__maleDog) + "只雄狗," + str(self.__femalDog) + "只雌狗。")
|
||||
|
||||
|
||||
|
||||
class WeightCounter(Visitor):
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__catNum = 0
|
||||
@@ -1031,9 +686,6 @@ class WeightCounter(Visitor):
|
||||
self.__dogNum = 0
|
||||
|
||||
self.__dogWeight = 0
|
||||
|
||||
|
||||
|
||||
def visit(self, data):
|
||||
|
||||
if isinstance(data, Cat):
|
||||
@@ -1051,29 +703,17 @@ class WeightCounter(Visitor):
|
||||
else:
|
||||
|
||||
print("Not support this type")
|
||||
|
||||
|
||||
|
||||
def getInfo(self):
|
||||
|
||||
print("猫的平均体重是:%0.2fkg, 狗的平均体重是:%0.2fkg" %
|
||||
|
||||
((self.__catWeight / self.__catNum),(self.__dogWeight / self.__dogNum)))
|
||||
|
||||
|
||||
|
||||
class AgeCounter(Visitor):
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__catMaxAge = 0
|
||||
|
||||
self.__dogMaxAge = 0
|
||||
|
||||
|
||||
|
||||
def visit(self, data):
|
||||
|
||||
if isinstance(data, Cat):
|
||||
@@ -1091,15 +731,9 @@ class AgeCounter(Visitor):
|
||||
else:
|
||||
|
||||
print("Not support this type")
|
||||
|
||||
|
||||
|
||||
def getInfo(self):
|
||||
|
||||
print("猫的最大年龄是:" + str(self.__catMaxAge) + ", 狗的最大年龄是:" + str(self.__dogMaxAge))
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p><strong>测试代码:</strong></p>
|
||||
@@ -1129,9 +763,6 @@ class AgeCounter(Visitor):
|
||||
genderCounter.getInfo()
|
||||
|
||||
print()
|
||||
|
||||
|
||||
|
||||
weightCounter = WeightCounter()
|
||||
|
||||
animals.action(weightCounter)
|
||||
@@ -1139,33 +770,18 @@ class AgeCounter(Visitor):
|
||||
weightCounter.getInfo()
|
||||
|
||||
print()
|
||||
|
||||
|
||||
|
||||
ageCounter = AgeCounter()
|
||||
|
||||
animals.action(ageCounter)
|
||||
|
||||
ageCounter.getInfo()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p><strong>输出结果:</strong></p>
|
||||
|
||||
<pre><code>1只雄猫,2只雌猫,2只雄狗,2只雌狗。
|
||||
|
||||
|
||||
|
||||
猫的平均体重是:4.07kg, 狗的平均体重是:26.50kg
|
||||
|
||||
|
||||
|
||||
猫的最大年龄是:1.2, 狗的最大年龄是:3
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>使用访问模式后,代码结构是不是清爽了很多!</p>
|
||||
@@ -1201,9 +817,6 @@ class AgeCounter(Visitor):
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1211,9 +824,6 @@ class AgeCounter(Visitor):
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1229,17 +839,11 @@ class AgeCounter(Visitor):
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1265,9 +869,6 @@ class AgeCounter(Visitor):
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1279,9 +880,6 @@ class AgeCounter(Visitor):
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1299,12 +897,6 @@ class AgeCounter(Visitor):
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 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 class="current-tab" 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">
|
||||
@@ -659,9 +455,6 @@ function hide_canvas() {
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -669,9 +462,6 @@ function hide_canvas() {
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -687,17 +477,11 @@ function hide_canvas() {
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -723,9 +507,6 @@ function hide_canvas() {
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -737,9 +518,6 @@ function hide_canvas() {
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -757,12 +535,6 @@ function hide_canvas() {
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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 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 class="current-tab" 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,9 +363,6 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class FilterScreen:
|
||||
|
||||
"""过滤网"""
|
||||
|
||||
|
||||
|
||||
def doFilter(self, rawMaterials):
|
||||
|
||||
for material in rawMaterials:
|
||||
@@ -579,9 +372,6 @@ function hide_canvas() {
|
||||
rawMaterials.remove(material)
|
||||
|
||||
return rawMaterials
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -597,9 +387,6 @@ function hide_canvas() {
|
||||
filteredMaterials = filter.doFilter(rawMaterials)
|
||||
|
||||
print("过滤后:", filteredMaterials)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -607,9 +394,6 @@ function hide_canvas() {
|
||||
<pre><code>过滤前: ['豆浆', '豆渣']
|
||||
|
||||
过滤后: ['豆浆']
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考过滤器模式</h3>
|
||||
@@ -647,15 +431,9 @@ function hide_canvas() {
|
||||
filteredMaterials = list(filter(isSoybeanMilk, rawMaterials))
|
||||
|
||||
print("过滤后:", filteredMaterials)
|
||||
|
||||
|
||||
|
||||
def isSoybeanMilk(material):
|
||||
|
||||
return material == "豆浆"
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>能提出这个问题,说明你是带思考阅读本文的。之所以要这么写,有以下两个原因:</p>
|
||||
@@ -675,15 +453,9 @@ def isSoybeanMilk(material):
|
||||
<pre><code class="language-python">from abc import ABCMeta, abstractmethod
|
||||
|
||||
# 引入ABCMeta和abstractmethod来定义抽象类和抽象方法
|
||||
|
||||
|
||||
|
||||
class Filter(metaclass=ABCMeta):
|
||||
|
||||
"""过滤器"""
|
||||
|
||||
|
||||
|
||||
@abstractmethod
|
||||
|
||||
def doFilter(self, elements):
|
||||
@@ -691,41 +463,23 @@ class Filter(metaclass=ABCMeta):
|
||||
"""过滤方法"""
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class FilterChain(Filter):
|
||||
|
||||
"过滤器链"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self._filters = []
|
||||
|
||||
|
||||
|
||||
def addFilter(self, filter):
|
||||
|
||||
self._filters.append(filter)
|
||||
|
||||
|
||||
|
||||
def removeFilter(self, filter):
|
||||
|
||||
self._filters.remove(filter)
|
||||
|
||||
|
||||
|
||||
def doFilter(self, elements):
|
||||
|
||||
for filter in self._filters:
|
||||
|
||||
filter.doFilter(elements)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h4>类图</h4>
|
||||
@@ -743,9 +497,6 @@ class FilterChain(Filter):
|
||||
<pre><code class="language-python">class FilterScreen(Filter):
|
||||
|
||||
"""过滤网"""
|
||||
|
||||
|
||||
|
||||
def doFilter(self, elements):
|
||||
|
||||
for material in elements:
|
||||
@@ -755,9 +506,6 @@ class FilterChain(Filter):
|
||||
elements.remove(material)
|
||||
|
||||
return elements
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码不用变。自己跑一下,会发现输出结果和之前的是一样的。</p>
|
||||
@@ -801,21 +549,12 @@ class FilterChain(Filter):
|
||||
<pre><code class="language-python">import re
|
||||
|
||||
# 引入正则表达式库
|
||||
|
||||
|
||||
|
||||
class SensitiveFilter(Filter):
|
||||
|
||||
"""敏感词过滤"""
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__sensitives = ["黄色", "台独", "贪污"]
|
||||
|
||||
|
||||
|
||||
def doFilter(self, elements):
|
||||
|
||||
# 敏感词列表转换成正则表达式
|
||||
@@ -827,9 +566,6 @@ class SensitiveFilter(Filter):
|
||||
regex += word + "|"
|
||||
|
||||
regex = regex[0: len(regex) - 1]
|
||||
|
||||
|
||||
|
||||
# 对每个元素进行过滤
|
||||
|
||||
newElements = []
|
||||
@@ -839,19 +575,10 @@ class SensitiveFilter(Filter):
|
||||
item, num = re.subn(regex, "", element)
|
||||
|
||||
newElements.append(item)
|
||||
|
||||
|
||||
|
||||
return newElements
|
||||
|
||||
|
||||
|
||||
class HtmlFilter(Filter):
|
||||
|
||||
"HTML特殊字符转换"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__wordMap = {
|
||||
@@ -867,9 +594,6 @@ class HtmlFilter(Filter):
|
||||
"\"": " &quot;",
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
def doFilter(self, elements):
|
||||
|
||||
newElements = []
|
||||
@@ -883,9 +607,6 @@ class HtmlFilter(Filter):
|
||||
newElements.append(element)
|
||||
|
||||
return newElements
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p><strong>测试代码:</strong></p>
|
||||
@@ -911,9 +632,6 @@ class HtmlFilter(Filter):
|
||||
newContents = filterChain.doFilter(contents)
|
||||
|
||||
print("过滤后的内容:", newContents)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p><strong>输出结果:</strong></p>
|
||||
@@ -921,9 +639,6 @@ class HtmlFilter(Filter):
|
||||
<pre><code>过滤前的内容: ['有人出售黄色书:<黄情味道>', '有人企图搞台独活动, ——"造谣咨询"']
|
||||
|
||||
过滤后的内容: ['有人出售书:&lt;黄情味道&gt;', '有人企图搞活动, —— &quot;造谣咨询 &quot;']
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>应用场景</h3>
|
||||
@@ -957,9 +672,6 @@ class HtmlFilter(Filter):
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -967,9 +679,6 @@ class HtmlFilter(Filter):
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -985,17 +694,11 @@ class HtmlFilter(Filter):
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1021,9 +724,6 @@ class HtmlFilter(Filter):
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1035,9 +735,6 @@ class HtmlFilter(Filter):
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1055,12 +752,6 @@ class HtmlFilter(Filter):
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 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 class="current-tab" 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,9 +363,6 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class PowerBank:
|
||||
|
||||
"移动电源"
|
||||
|
||||
|
||||
|
||||
def __init__(self, serialNum, electricQuantity):
|
||||
|
||||
self.__serialNum = serialNum
|
||||
@@ -577,39 +370,21 @@ function hide_canvas() {
|
||||
self.__electricQuantity = electricQuantity
|
||||
|
||||
self.__user = ''
|
||||
|
||||
|
||||
|
||||
def getSerialNum(self):
|
||||
|
||||
return self.__serialNum
|
||||
|
||||
|
||||
|
||||
def getElectricQuantity(self):
|
||||
|
||||
return self.__electricQuantity
|
||||
|
||||
|
||||
|
||||
def setUser(self, user):
|
||||
|
||||
self.__user = user
|
||||
|
||||
|
||||
|
||||
def getUser(self):
|
||||
|
||||
return self.__user
|
||||
|
||||
|
||||
|
||||
def showInfo(self):
|
||||
|
||||
print("序列号:" + str(self.__serialNum) + " 电量:" + str(self.__electricQuantity) + "% 使用者:" + self.__user)
|
||||
|
||||
|
||||
|
||||
class ObjectPack:
|
||||
|
||||
"对象的包装类,封装指定的对象(如充电宝)是否被使用中"
|
||||
@@ -619,33 +394,18 @@ class ObjectPack:
|
||||
self.__obj = obj
|
||||
|
||||
self.__inUsing = inUsing
|
||||
|
||||
|
||||
|
||||
def inUsing(self):
|
||||
|
||||
return self.__inUsing
|
||||
|
||||
|
||||
|
||||
def setUsing(self, isUsing):
|
||||
|
||||
self.__inUsing = isUsing
|
||||
|
||||
|
||||
|
||||
def getObj(self):
|
||||
|
||||
return self.__obj
|
||||
|
||||
|
||||
|
||||
class PowerBankBox:
|
||||
|
||||
"存放移动电源的智能箱盒"
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__pools = {}
|
||||
@@ -653,9 +413,6 @@ class PowerBankBox:
|
||||
self.__pools['0001'] = ObjectPack(PowerBank('0001', 100))
|
||||
|
||||
self.__pools['0002'] = ObjectPack(PowerBank('0002', 100))
|
||||
|
||||
|
||||
|
||||
def borrow(self, serialNum):
|
||||
|
||||
"使用移动电源"
|
||||
@@ -679,9 +436,6 @@ class PowerBankBox:
|
||||
print(str(serialNum) + "电源已被借用!")
|
||||
|
||||
return result
|
||||
|
||||
|
||||
|
||||
def giveBack(self, serialNum):
|
||||
|
||||
"归还移动电源"
|
||||
@@ -693,9 +447,6 @@ class PowerBankBox:
|
||||
item.setUsing(False)
|
||||
|
||||
print(str(serialNum) + "电源已归还!")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -731,9 +482,6 @@ class PowerBankBox:
|
||||
powerBank3.setUser('Aimee')
|
||||
|
||||
powerBank3.showInfo()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -747,9 +495,6 @@ class PowerBankBox:
|
||||
0001电源已归还!
|
||||
|
||||
序列号:0001 电量:100% 使用者:Aimee
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考对象池机制</h3>
|
||||
@@ -803,53 +548,29 @@ import logging
|
||||
import time
|
||||
|
||||
# 引入时间模块
|
||||
|
||||
|
||||
|
||||
class PooledObject:
|
||||
|
||||
"池对象,也称池化对象"
|
||||
|
||||
|
||||
|
||||
def __init__(self, obj):
|
||||
|
||||
self.__obj = obj
|
||||
|
||||
self.__busy = False
|
||||
|
||||
|
||||
|
||||
def getObject(self):
|
||||
|
||||
return self.__obj
|
||||
|
||||
|
||||
|
||||
def setObject(self, obj):
|
||||
|
||||
self.__obj = obj
|
||||
|
||||
|
||||
|
||||
def isBusy(self):
|
||||
|
||||
return self.__busy
|
||||
|
||||
|
||||
|
||||
def setBusy(self, busy):
|
||||
|
||||
self.__busy = busy
|
||||
|
||||
|
||||
|
||||
class ObjectPool(metaclass=ABCMeta):
|
||||
|
||||
"对象池"
|
||||
|
||||
|
||||
|
||||
"对象池初始化大小"
|
||||
|
||||
InitialNumOfObjects = 10
|
||||
@@ -857,9 +578,6 @@ class ObjectPool(metaclass=ABCMeta):
|
||||
"对象池最大的大小"
|
||||
|
||||
MaxNumOfObjects = 50
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.__pools = []
|
||||
@@ -869,9 +587,6 @@ class ObjectPool(metaclass=ABCMeta):
|
||||
obj = self.createPooledObject()
|
||||
|
||||
self.__pools.append(obj)
|
||||
|
||||
|
||||
|
||||
@abstractmethod
|
||||
|
||||
def createPooledObject(self):
|
||||
@@ -879,9 +594,6 @@ class ObjectPool(metaclass=ABCMeta):
|
||||
"子类提供创建对象的方法"
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def borrowObject(self):
|
||||
|
||||
# 如果找到空闲对象,直接返回
|
||||
@@ -893,9 +605,6 @@ class ObjectPool(metaclass=ABCMeta):
|
||||
logging.info("%s对象已被借用, time:%d", id(obj), time.time())
|
||||
|
||||
return obj
|
||||
|
||||
|
||||
|
||||
# 如果对象池未满,则添加新的对象
|
||||
|
||||
if(len(self.__pools) < ObjectPool.MaxNumOfObjects):
|
||||
@@ -909,15 +618,9 @@ class ObjectPool(metaclass=ABCMeta):
|
||||
logging.info("%s对象已被借用, time:%d", id(pooledObj.getObject()), time.time())
|
||||
|
||||
return pooledObj.getObject()
|
||||
|
||||
|
||||
|
||||
# 对象池已满且没有空闲对象,则返回None
|
||||
|
||||
return None
|
||||
|
||||
|
||||
|
||||
def returnObject(self, obj):
|
||||
|
||||
for pooledObj in self.__pools:
|
||||
@@ -929,9 +632,6 @@ class ObjectPool(metaclass=ABCMeta):
|
||||
logging.info("%s对象已归还, time:%d", id(pooledObj.getObject()), time.time())
|
||||
|
||||
break
|
||||
|
||||
|
||||
|
||||
def addObject(self):
|
||||
|
||||
obj = None
|
||||
@@ -945,15 +645,9 @@ class ObjectPool(metaclass=ABCMeta):
|
||||
logging.info("添加新对象%s, time:%d", id(obj), time.time())
|
||||
|
||||
return obj
|
||||
|
||||
|
||||
|
||||
def clear(self):
|
||||
|
||||
self.__pools.clear()
|
||||
|
||||
|
||||
|
||||
def _findFreeObject(self):
|
||||
|
||||
"查找空闲的对象"
|
||||
@@ -971,9 +665,6 @@ class ObjectPool(metaclass=ABCMeta):
|
||||
break
|
||||
|
||||
return obj
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h4>类图</h4>
|
||||
@@ -991,9 +682,6 @@ class ObjectPool(metaclass=ABCMeta):
|
||||
<pre><code class="language-python">class PowerBank:
|
||||
|
||||
"移动电源"
|
||||
|
||||
|
||||
|
||||
def __init__(self, serialNum, electricQuantity):
|
||||
|
||||
self.__serialNum = serialNum
|
||||
@@ -1001,47 +689,23 @@ class ObjectPool(metaclass=ABCMeta):
|
||||
self.__electricQuantity = electricQuantity
|
||||
|
||||
self.__user = ""
|
||||
|
||||
|
||||
|
||||
def getSerialNum(self):
|
||||
|
||||
return self.__serialNum
|
||||
|
||||
|
||||
|
||||
def getElectricQuantity(self):
|
||||
|
||||
return self.__electricQuantity
|
||||
|
||||
|
||||
|
||||
def setUser(self, user):
|
||||
|
||||
self.__user = user
|
||||
|
||||
|
||||
|
||||
def getUser(self):
|
||||
|
||||
return self.__user
|
||||
|
||||
|
||||
|
||||
def showInfo(self):
|
||||
|
||||
print("序列号:%03d 电量:%d%% 使用者:%s" % (self.__serialNum, self.__electricQuantity, self.__user))
|
||||
|
||||
|
||||
|
||||
class PowerBankPool(ObjectPool):
|
||||
|
||||
|
||||
|
||||
__serialNum = 0
|
||||
|
||||
|
||||
|
||||
@classmethod
|
||||
|
||||
def getSerialNum(cls):
|
||||
@@ -1049,17 +713,11 @@ class PowerBankPool(ObjectPool):
|
||||
cls.__serialNum += 1
|
||||
|
||||
return cls.__serialNum
|
||||
|
||||
|
||||
|
||||
def createPooledObject(self):
|
||||
|
||||
powerBank = PowerBank(PowerBankPool.getSerialNum(), 100)
|
||||
|
||||
return PooledObject(powerBank)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码得稍微改一下:</p>
|
||||
@@ -1095,17 +753,11 @@ class PowerBankPool(ObjectPool):
|
||||
powerBank3.setUser("Aimee")
|
||||
|
||||
powerBank3.showInfo()
|
||||
|
||||
|
||||
|
||||
powerBankPool.returnObject(powerBank2)
|
||||
|
||||
powerBankPool.returnObject(powerBank3)
|
||||
|
||||
powerBankPool.clear()
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -1115,9 +767,6 @@ class PowerBankPool(ObjectPool):
|
||||
序列号:002 电量:100% 使用者:Sam
|
||||
|
||||
序列号:001 电量:100% 使用者:Aimee
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h4>设计要点</h4>
|
||||
@@ -1187,9 +836,6 @@ class PowerBankPool(ObjectPool):
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1197,9 +843,6 @@ class PowerBankPool(ObjectPool):
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1215,17 +858,11 @@ class PowerBankPool(ObjectPool):
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1251,9 +888,6 @@ class PowerBankPool(ObjectPool):
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1265,9 +899,6 @@ class PowerBankPool(ObjectPool):
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1285,12 +916,6 @@ class PowerBankPool(ObjectPool):
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 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 class="current-tab" 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">
|
||||
@@ -561,63 +357,39 @@ function hide_canvas() {
|
||||
<pre><code class="language-python">class Employee:
|
||||
|
||||
"""公司员工"""
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def doPerformance(self, skill):
|
||||
|
||||
print(self.__name + "的表演:", end="")
|
||||
|
||||
skill()
|
||||
|
||||
|
||||
|
||||
def sing():
|
||||
|
||||
"""唱歌"""
|
||||
|
||||
print("唱一首歌")
|
||||
|
||||
|
||||
|
||||
def dling():
|
||||
|
||||
"""拉Ukulele"""
|
||||
|
||||
print("拉一曲Ukulele")
|
||||
|
||||
|
||||
|
||||
def joke():
|
||||
|
||||
"""说段子"""
|
||||
|
||||
print("说一搞笑段子")
|
||||
|
||||
|
||||
|
||||
def performMagicTricks():
|
||||
|
||||
"""表演魔术"""
|
||||
|
||||
print("神秘魔术")
|
||||
|
||||
|
||||
|
||||
def skateboarding():
|
||||
|
||||
"""玩滑板"""
|
||||
|
||||
print("酷炫滑板")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>测试代码:</p>
|
||||
@@ -643,9 +415,6 @@ def skateboarding():
|
||||
Kerry = Employee("Kerry")
|
||||
|
||||
Kerry.doPerformance(skateboarding)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>输出结果:</p>
|
||||
@@ -659,9 +428,6 @@ Jacky的表演:说一搞笑段子
|
||||
Chork的表演:神秘魔术
|
||||
|
||||
Kerry的表演:酷炫滑板
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>从剧情中思考回调机制</h3>
|
||||
@@ -697,15 +463,9 @@ Kerry的表演:酷炫滑板
|
||||
<pre><code class="language-python">def isEvenNumber(num):
|
||||
|
||||
return num % 2 == 0
|
||||
|
||||
|
||||
|
||||
def isGreaterThanTen(num):
|
||||
|
||||
return num > 10
|
||||
|
||||
|
||||
|
||||
def getEvenNumbers(fun, elements):
|
||||
|
||||
newList = []
|
||||
@@ -717,9 +477,6 @@ def getEvenNumbers(fun, elements):
|
||||
newList.append(item)
|
||||
|
||||
return newList
|
||||
|
||||
|
||||
|
||||
def testCallback():
|
||||
|
||||
elements = [2, 3, 6, 9, 12, 15, 18]
|
||||
@@ -731,9 +488,6 @@ def testCallback():
|
||||
print("所有的偶数:", list1)
|
||||
|
||||
print("大于10的数:", list2)
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>结果如下:</p>
|
||||
@@ -741,9 +495,6 @@ def testCallback():
|
||||
<pre><code>所有的偶数: [2, 6, 12, 18]
|
||||
|
||||
大于10的数: [12, 15, 18]
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>上面这个例子,我们只是演示一下回调函数如何实现。在真正的项目中,可直接使用 Python 内置的 filter 函数和 lambda 表达式,代码更简洁,如下:</p>
|
||||
@@ -751,9 +502,6 @@ def testCallback():
|
||||
<pre><code class="language-python">list1 = list(filter(lambda x: x % 2 == 0, elements))
|
||||
|
||||
list2 = list(filter(lambda x: x > 10, elements))
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h3>面向对象的方式实现回调机制</h3>
|
||||
@@ -771,15 +519,9 @@ list2 = list(filter(lambda x: x > 10, elements))
|
||||
<pre><code class="language-python">from abc import ABCMeta, abstractmethod
|
||||
|
||||
# 引入ABCMeta和abstractmethod来定义抽象类和抽象方法
|
||||
|
||||
|
||||
|
||||
class Skill(metaclass=ABCMeta):
|
||||
|
||||
"""技能的抽象类"""
|
||||
|
||||
|
||||
|
||||
@abstractmethod
|
||||
|
||||
def performance(self):
|
||||
@@ -787,29 +529,17 @@ class Skill(metaclass=ABCMeta):
|
||||
"""技能表演"""
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
class NewEmployee:
|
||||
|
||||
"""公司新员工"""
|
||||
|
||||
|
||||
|
||||
def __init__(self, name):
|
||||
|
||||
self.__name = name
|
||||
|
||||
|
||||
|
||||
def doPerformance(self, skill):
|
||||
|
||||
print(self.__name + "的表演:", end="")
|
||||
|
||||
skill.performance()
|
||||
|
||||
|
||||
|
||||
class Sing(Skill):
|
||||
|
||||
"""唱歌"""
|
||||
@@ -817,9 +547,6 @@ class Sing(Skill):
|
||||
def performance(self):
|
||||
|
||||
print("唱一首歌")
|
||||
|
||||
|
||||
|
||||
class Joke(Skill):
|
||||
|
||||
"""说段子"""
|
||||
@@ -827,9 +554,6 @@ class Joke(Skill):
|
||||
def performance(self):
|
||||
|
||||
print("说一搞笑段子")
|
||||
|
||||
|
||||
|
||||
class Dling(Skill):
|
||||
|
||||
"""拉Ukulele"""
|
||||
@@ -837,9 +561,6 @@ class Dling(Skill):
|
||||
def performance(self):
|
||||
|
||||
print("拉一曲Ukulele")
|
||||
|
||||
|
||||
|
||||
class PerformMagicTricks(Skill):
|
||||
|
||||
"""表演魔术"""
|
||||
@@ -847,9 +568,6 @@ class PerformMagicTricks(Skill):
|
||||
def performance(self):
|
||||
|
||||
print("神秘魔术")
|
||||
|
||||
|
||||
|
||||
class Skateboarding(Skill):
|
||||
|
||||
"""玩滑板"""
|
||||
@@ -857,9 +575,6 @@ class Skateboarding(Skill):
|
||||
def performance(self):
|
||||
|
||||
print("酷炫滑板")
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p><strong>测试代码:</strong></p>
|
||||
@@ -885,9 +600,6 @@ class Skateboarding(Skill):
|
||||
Kerry = NewEmployee("Kerry")
|
||||
|
||||
Kerry.doPerformance(Skateboarding())
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>自己测试一下,结果和回调函数的方式是一样的。</p>
|
||||
@@ -913,9 +625,6 @@ interface ISkill {
|
||||
public void performance();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
||||
* 员工类
|
||||
@@ -925,17 +634,11 @@ interface ISkill {
|
||||
public class NewEmployee {
|
||||
|
||||
private String name;
|
||||
|
||||
|
||||
|
||||
public NewEmployee(String name) {
|
||||
|
||||
this.name = name;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void doPerformance(ISkill skill) {
|
||||
|
||||
System.out.print(this.name + "的表演:");
|
||||
@@ -943,9 +646,6 @@ public class NewEmployee {
|
||||
skill.performance();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
||||
* 用Main方法来测试
|
||||
@@ -969,9 +669,6 @@ public class NewEmployee {
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
NewEmployee frank = new NewEmployee("Frank");
|
||||
|
||||
frank.doPerformance(new ISkill() {
|
||||
@@ -989,9 +686,6 @@ public class NewEmployee {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h4>设计要点</h4>
|
||||
@@ -1053,9 +747,6 @@ public class NewEmployee {
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1063,9 +754,6 @@ public class NewEmployee {
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1081,17 +769,11 @@ public class NewEmployee {
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1117,9 +799,6 @@ public class NewEmployee {
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1131,9 +810,6 @@ public class NewEmployee {
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1151,12 +827,6 @@ public class NewEmployee {
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -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 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 class="current-tab" 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">
|
||||
@@ -641,9 +437,6 @@ function hide_canvas() {
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -651,9 +444,6 @@ function hide_canvas() {
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -669,17 +459,11 @@ function hide_canvas() {
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -705,9 +489,6 @@ function hide_canvas() {
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -719,9 +500,6 @@ function hide_canvas() {
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -739,12 +517,6 @@ function hide_canvas() {
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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 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 class="current-tab" 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">
|
||||
@@ -647,17 +443,11 @@ function hide_canvas() {
|
||||
<p>你有没有见过一些特别奇葩、无脑、或具有误导性的变量名、函数名、类名吗?如下面这样的:</p>
|
||||
|
||||
<pre><code class="language-python"># 下面的例子改编自网上讨论比较火的几个案例
|
||||
|
||||
|
||||
|
||||
# Demo1
|
||||
|
||||
correct = False
|
||||
|
||||
# 嗯,这是对呢?还是错呢?
|
||||
|
||||
|
||||
|
||||
# Demo2
|
||||
|
||||
from enum import Enum
|
||||
@@ -669,9 +459,6 @@ class Color(Enum):
|
||||
Hong = 2 # 红色
|
||||
|
||||
# 嗯,这哥们是红色(Red)的单词不会写呢,还是觉得绿色(Lv)的拼音太难看呢?
|
||||
|
||||
|
||||
|
||||
# Demo3
|
||||
|
||||
def dynamic():
|
||||
@@ -681,9 +468,6 @@ def dynamic():
|
||||
# todo something
|
||||
|
||||
# 你能想到这个函数是干嘛用的吗?其实是一个表示“活动”的函数。这英语是数学老师教的吗~
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>如果有,果断把它改掉!一个良好的名称(变量名、函数名、类名),能让你的代码可读性立刻提高十倍。在下面的“代码整洁之道”中将会继续讲解程序取名的技巧和原则。</p>
|
||||
@@ -951,9 +735,6 @@ def dynamic():
|
||||
qDebug()<<(QString("slot_onChannelUserJoined, uid:%1").arg(uid));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ClassWidget::slot_onChannelUserLeaved(QString uid)
|
||||
|
||||
{
|
||||
@@ -977,9 +758,6 @@ void ClassWidget::slot_onChannelUserLeaved(QString uid)
|
||||
qDebug()<<(QString("slot_onChannelUserLeaved, uid:%1").arg(uid));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>上面两个函数中 for 循环的功能几乎是一样的,就是通过 uid 来找到对应的 Widget,然后进行相应的操作。这里就可以提炼出一个 getWidgetByUid(uid) 的方法,两个函数通过调用这个方法获得 widget 对象并进行相应的操作。</p>
|
||||
@@ -1031,9 +809,6 @@ void ClassWidget::slot_onChannelUserLeaved(QString uid)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>这时根据 isShow 变量值的不同,分别进行了两个循环,可以把这种判断放到循环内进行。重构后的代码如下:</p>
|
||||
@@ -1057,9 +832,6 @@ void ClassWidget::slot_onChannelUserLeaved(QString uid)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>代码量是不是一下减了一半?</p>
|
||||
@@ -1101,9 +873,6 @@ else if(state == STATE_NODATA)
|
||||
ui->widgetNoData->show();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>重构后的代码:</p>
|
||||
@@ -1171,9 +940,6 @@ default:
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>这时其实可以进行进一步的重构,就是每一个 case 里的代码段都提炼成一个方法(函数)。</p>
|
||||
@@ -1205,9 +971,6 @@ if(pItem && pItem->isJoined())
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>重构后的代码,由两层嵌套变成了一层嵌套:</p>
|
||||
@@ -1239,9 +1002,6 @@ if(inSharingDesktop)
|
||||
sendStartSharingDesktopMsg(sharingDesktopData);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</code></pre>
|
||||
|
||||
<p>这代码其实还算好的,只有两层嵌套。我见过一段前端的代码,有七、八层的 if 嵌套,这种代码称为“箭头型”代码,网上有一张神图很形象地表现了这种代码:</p>
|
||||
@@ -1263,9 +1023,6 @@ if(inSharingDesktop)
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1273,9 +1030,6 @@ if(inSharingDesktop)
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||||
|
||||
</div>
|
||||
@@ -1291,17 +1045,11 @@ if(inSharingDesktop)
|
||||
<script>
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
|
||||
|
||||
function gtag() {
|
||||
|
||||
dataLayer.push(arguments);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-NPSEEVD756');
|
||||
@@ -1327,9 +1075,6 @@ if(inSharingDesktop)
|
||||
setCookie("lastPath", path)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setCookie(cname, cvalue) {
|
||||
|
||||
var d = new Date();
|
||||
@@ -1341,9 +1086,6 @@ if(inSharingDesktop)
|
||||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getCookie(cname) {
|
||||
|
||||
var name = cname + "=";
|
||||
@@ -1361,12 +1103,6 @@ if(inSharingDesktop)
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user