This commit is contained in:
周伟
2022-05-11 19:04:14 +08:00
parent 9440ac7291
commit d9c5ffd627
826 changed files with 0 additions and 481675 deletions

View File

@@ -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 &lt; y ? x : y
</code></pre>
<p>而 Python 是这样的:</p>
<pre><code class="language-python">min = x if x &lt; y else y
</code></pre>
<p>有没有觉得第二种方式更接近人类的自然思维?</p>
@@ -731,9 +521,6 @@ print(&quot;name:&quot;, name)
age = name
print(&quot;age:&quot;, age)
a = b = c = 5
# a,b,c三个变量指向相同的内存空间具有相同的值
@@ -741,9 +528,6 @@ a = b = c = 5
print(&quot;a:&quot;, a, &quot;b:&quot;, b, &quot;c:&quot;, c)
print(&quot;id(a):&quot;, id(a), &quot;id(b):&quot;, id(b), &quot;id(c):&quot;, 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(&quot;added data&quot;)
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:
&quot;这是一个测试类&quot;
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(&quot;name:&quot; + 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(&quot;title:&quot; + 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 {
&quot;&quot;
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(&quot;name:&quot;, self.__name)
@@ -1263,43 +960,25 @@ public class Test {
print(&quot;visited:&quot;, self.visited)
Person.visited = Person.visited +1
class Teacher(Person):
&quot;老师&quot;
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(&quot;title:&quot;, self.__title)
super().showInfo()
def testPerson():
&quot;测试方法&quot;
@@ -1309,21 +988,12 @@ def testPerson():
tony.showInfo()
print();
jenny = Teacher(&quot;Jenny&quot;, 34, 1.68);
jenny.setTitle(&quot;教授&quot;);
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>

View File

@@ -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:
&quot;热水器:战胜寒冬的有利武器&quot;
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(&quot;current temperature is:&quot;, 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:
&quot;洗澡模式和饮用模式的父类&quot;
def update(self, waterHeater):
pass
class WashingMode(Observer):
&quot;该模式用于洗澡用&quot;
def update(self, waterHeater):
if waterHeater.getTemperature() &gt;= 50 and waterHeater.getTemperature() &lt; 70:
print(&quot;水已烧好,温度正好!可以用来洗澡了。&quot;)
class DrinkingMode(Observer):
&quot;该模式用于饮用&quot;
def update(self, waterHeater):
if waterHeater.getTemperature() &gt;= 100:
print(&quot;水已烧开!可以用来饮用了。&quot;)
</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:
&quot;观察者的基类&quot;
def update(self, observer, object):
pass
class Observable:
&quot;被观察者的基类&quot;
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):
&quot;热水器:战胜寒冬的有利武器&quot;
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(&quot;current temperature is:&quot;, self.__temperature)
self.notifyObservers()
class WashingMode(Observer):
&quot;该模式用于洗澡用&quot;
def update(self, observable, object):
if isinstance(observable,
@@ -807,23 +525,14 @@ class WashingMode(Observer):
WaterHeater) and observable.getTemperature() &gt;= 50 and observable.getTemperature() &lt; 70:
print(&quot;水已烧好,温度正好!可以用来洗澡了。&quot;)
class DrinkingMode(Observer):
&quot;该模式用于饮用&quot;
def update(self, observable, object):
if isinstance(observable, WaterHeater) and observable.getTemperature() &gt;= 100:
print(&quot;水已烧开!可以用来饮用了。&quot;)
</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>

View File

@@ -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:
&quot;接口类,提供空实现的方法,由子类去实现&quot;
def getName(self):
&quot;获取姓名&quot;
pass
def getHeight(self):
&quot;获取身高&quot;
pass
class HighPerson(IHightPerson):
&quot;个高的人&quot;
def __init__(self, name):
self.__name = name
def getName(self):
return self.__name
def getHeight(self):
return 170
class ShortPerson:
&quot;个矮的人&quot;
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):
&quot;有高跟鞋搭配的人&quot;
def getHeight(self):
return super().getRealHeight() + super().getShoesHeight()
</code></pre>
<p>测试代码:</p>
@@ -703,9 +457,6 @@ class DecoratePerson(ShortPerson, IHightPerson):
&quot;&quot;&quot;
return person.getHeight() &gt;= 165;
def testPerson():
lira = HighPerson(&quot;Lira&quot;)
@@ -721,9 +472,6 @@ def testPerson():
print(demi.getName() + &quot;身高&quot; + str(demi.getHeight()) + &quot;在高跟鞋的适配下,你身高不输高圆圆,气质不输范冰冰!&quot;)
print(&quot;是否适合做接待员:&quot;, &quot;符合&quot; if canPlayReceptionist(lira) else &quot;不符合&quot;)
</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 &quot;&quot; + str(self.__pageNum) + &quot; 页的内容...&quot;
class Catalogue:
&quot;目录结构&quot;
def __init__(self, title):
self.__title = title
@@ -897,15 +630,9 @@ class Catalogue:
self.setChapter(&quot;第一章&quot;)
self.setChapter(&quot;第二章&quot;)
def setChapter(self, title):
self.__chapters.append(title)
def showInfo(self):
print(&quot;标题:&quot; + self.__title)
@@ -913,45 +640,24 @@ class Catalogue:
for chapter in self.__chapters:
print(chapter)
class IBook:
&quot;电子书文档的接口类&quot;
def parseFile(self, filePath):
pass
def getCatalogue(self):
pass
def getPageCount(self):
pass
def getPage(self, pageNum):
pass
class TxtBook(IBook):
&quot;TXT解析类&quot;
def parseFile(self, filePath):
# 模拟文档的解析
@@ -961,33 +667,18 @@ class TxtBook(IBook):
self.__pageCount = 500
return True
def getCatalogue(self):
return Catalogue(&quot;TXT电子书&quot;)
def getPageCount(self):
return self.__pageCount
def getPage(self, pageNum):
return Page(pageNum)
class EpubBook(IBook):
&quot;TXT解析类&quot;
def parseFile(self, filePath):
# 模拟文档的解析
@@ -997,65 +688,35 @@ class EpubBook(IBook):
self.__pageCount = 800
return True
def getCatalogue(self):
return Catalogue(&quot;Epub电子书&quot;)
def getPageCount(self):
return self.__pageCount
def getPage(self, pageNum):
return Page(pageNum)
class Outline:
&quot;第三方PDF解析库的目录类&quot;
pass
class PdfPage:
&quot;PDF页&quot;
def __init__(self, pageNum):
self.__pageNum = pageNum
def getPageNum(self):
return self.__pageNum
class ThirdPdf:
&quot;第三方PDF解析库&quot;
def __init__(self):
self.__pageSize = 0
def open(self, filePath):
print(&quot;第三方解析PDF文件&quot; + 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):
&quot;TXT解析类&quot;
def parseFile(self, filePath):
# 模拟文档的解析
@@ -1101,9 +747,6 @@ class PdfAdapterBook(ThirdPdf, IBook):
print(filePath + &quot;文件解析成功&quot;)
return rtn
def getCatalogue(self):
outline = super().getOutline()
@@ -1111,15 +754,9 @@ class PdfAdapterBook(ThirdPdf, IBook):
print(&quot;将Outline结构的目录转换成Catalogue结构的目录&quot;)
return Catalogue(&quot;PDF电子书&quot;)
def getPageCount(self):
return super().pageSize()
def getPage(self, pageNum):
page = self.page(pageNum)
@@ -1127,21 +764,12 @@ class PdfAdapterBook(ThirdPdf, IBook):
print(&quot;将PdfPage的面对象转换成Page的对象&quot;)
return Page(page.getPageNum())
# 导入os库
import os
class Reader:
&quot;阅读器&quot;
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(&quot;关闭 &quot; + self.__filePath + &quot; 文件&quot;)
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 &lt; 1 or pageNum &gt; self.__curBook.getPageCount()):
return None
self.__curPageNum = pageNum
print(&quot;显示第&quot; + str(self.__curPageNum) + &quot;&quot;)
@@ -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(&quot;平凡的世界.epub&quot;)):
return
@@ -1281,9 +879,6 @@ class Reader:
reader.closeFile()
print()
if (not reader.openFile(&quot;平凡的世界.pdf&quot;)):
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>

View File

@@ -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:
&quot;水(H2O)&quot;
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(&quot;初始化为&quot;, 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(&quot;气态&quot;))
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:
&quot;状态&quot;
def __init__(self, name):
self.__name = name
def getStateName(self):
return self.__name
def behavior(self, water):
pass
class SolidState(State):
&quot;固态&quot;
def __init__(self, name):
super().__init__(name)
def behavior(self, water):
print(&quot;我性格高冷,当前体温&quot;, water.getTemperature(),
&quot;摄氏度,我坚如钢铁,仿如一冷血动物,请用我砸人,嘿嘿……&quot;)
class LiquidState(State):
&quot;液态&quot;
def __init__(self, name):
super().__init__(name)
def behavior(self, water):
print(&quot;我性格温和,当前体温&quot;, water.getTemperature(),
&quot;摄氏度,我可滋润万物,饮用我可让你活力倍增……&quot;)
class GaseousState(State):
&quot;气态&quot;
def __init__(self, name):
super().__init__(name)
def behavior(self, water):
print(&quot;我性格热烈,当前体温&quot;, water.getTemperature(),
&quot;摄氏度,飞向天空是我毕生的梦想,在这你将看不到我的存在,我将达到无我的境界……&quot;)
</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:
&quot;状态的基类&quot;
@@ -909,29 +615,17 @@ class State:
def __init__(self, name):
self.__name = name
def getStateName(self):
return self.__name
def isMatch(self, stateInfo):
&quot;状态信息stateInfo是否在当前的状态范围内&quot;
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):
&quot;水(H2O)&quot;
def __init__(self):
super().__init__()
@@ -961,33 +652,18 @@ class State:
self.addState(GaseousState(&quot;气态&quot;))
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):
&quot;构造一个单例的装饰器&quot;
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):
&quot;固态&quot;
def __init__(self, name):
super().__init__(name)
def isMatch(self, stateInfo):
return stateInfo &lt; 0
def behavior(self, context):
if (isinstance(context, Water)):
@@ -1049,29 +704,17 @@ class SolidState(State):
print(&quot;我性格高冷,当前体温&quot;, context.getTemperature(),
&quot;摄氏度,我坚如钢铁,仿如一冷血动物,请用我砸人,嘿嘿……&quot;)
@singleton
class LiquidState(State):
&quot;液态&quot;
def __init__(self, name):
super().__init__(name)
def isMatch(self, stateInfo):
return (stateInfo &gt;= 0 and stateInfo &lt; 100)
def behavior(self, context):
if (isinstance(context, Water)):
@@ -1079,29 +722,17 @@ class LiquidState(State):
print(&quot;我性格温和,当前体温&quot;, context.getTemperature(),
&quot;摄氏度,我可滋润万物,饮用我可让你活力倍增……&quot;)
@singleton
class GaseousState(State):
&quot;气态&quot;
def __init__(self, name):
super().__init__(name)
def isMatch(self, stateInfo):
return stateInfo &gt;= 100
def behavior(self, context):
if (isinstance(context, Water)):
@@ -1109,17 +740,11 @@ class GaseousState(State):
print(&quot;我性格热烈,当前体温&quot;, context.getTemperature(),
&quot;摄氏度,飞向天空是我毕生的梦想,在这你将看不到我的存在,我将达到无我的境界……&quot;)
</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>

View File

@@ -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(&quot;遇见&quot; + name + &quot;,我置若罔闻!&quot;)
def showMyHeart(self):
print(self.__name + &quot;就我心中的唯一!&quot;)
</code></pre>
<p>测试代码:</p>
@@ -625,9 +409,6 @@ function hide_canvas() {
kimi.showMyHeart()
print(&quot;id(jenny):&quot;, id(jenny), &quot; id(kimi):&quot;, 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(&quot;Tony&quot;)
@@ -723,9 +489,6 @@ print(tony.getName(), karry.getName())
print(&quot;id(tony):&quot;, id(tony), &quot;id(karry):&quot;, id(karry))
print(&quot;tony == karry:&quot;, tony == karry)
</code></pre>
<p>输出结果:</p>
@@ -735,9 +498,6 @@ print(&quot;tony == karry:&quot;, 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):
&quot;&quot;&quot;单例实现方式二&quot;&quot;&quot;
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):
&quot;&quot;&quot;用户自定义的类&quot;&quot;&quot;
def __init__(self, name):
self.__name = name
def getName(self):
return self.__name
tony = CustomClass(&quot;Tony&quot;)
karry = CustomClass(&quot;Karry&quot;)
@@ -847,9 +577,6 @@ print(tony.getName(), karry.getName())
print(&quot;id(tony):&quot;, id(tony), &quot;id(karry):&quot;, id(karry))
print(&quot;tony == karry:&quot;, tony == karry)
</code></pre>
<p>输出结果:</p>
@@ -859,9 +586,6 @@ print(&quot;tony == karry:&quot;, tony == karry)
id(tony): 50794608 id(karry): 50794608
tony == karry: True
</code></pre>
<p>在上面的代码中,我们定义了一个 metaclassSingleton2来控制对象的实例化过程。在定义自己的类时我们通过 class CustomClass(metaclass=Singleton2) 来显示地指定 metaclass 为 Singleton2。如果你还不太熟悉 metaclass想了解更多关于它的原理请参见《[附录 Python 中 metaclass 的原理](》。</p>
@@ -873,9 +597,6 @@ tony == karry: True
&quot;&quot;&quot;定义一个单例装饰器&quot;&quot;&quot;
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:
&quot;&quot;&quot;使用单例装饰器修饰一个类&quot;&quot;&quot;
def __init__(self, name):
self.__name = name
def getName(self):
return self.__name
tony = Singleton3(&quot;Tony&quot;)
karry = Singleton3(&quot;Karry&quot;)
@@ -919,9 +625,6 @@ print(tony.getName(), karry.getName())
print(&quot;id(tony):&quot;, id(tony), &quot;id(karry):&quot;, id(karry))
print(&quot;tony == karry:&quot;, tony == karry)
</code></pre>
<p>输出结果:</p>
@@ -931,9 +634,6 @@ print(&quot;tony == karry:&quot;, 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):
&quot;&quot;&quot;我的漂亮女神&quot;&quot;&quot;
def __init__(self, name):
self.__name = name
@@ -967,15 +664,9 @@ class MyBeautifulGril(object):
else:
print(&quot;遇见&quot; + name + &quot;,我置若罔闻!&quot;)
def showMyHeart(self):
print(self.__name + &quot;就我心中的唯一!&quot;)
</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>

View File

@@ -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, &quot;申请请假&quot;, self.__dayoff, &quot;天。请假事由:&quot;, self.__reason)
@@ -625,15 +406,9 @@ function hide_canvas() {
if( self.__leader is not None):
self.__leader.handleRequest(self)
class Manager:
&quot;公司管理人员&quot;
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):
&quot;主管&quot;
def __init__(self, name, title):
super().__init__(name, title)
def handleRequest(self, person):
if(person.getDayOff() &lt;= 2):
@@ -697,9 +448,6 @@ class Supervisor(Manager):
if(nextHander is not None):
nextHander.handleRequest(person)
class DepartmentManager(Manager):
&quot;部门总监&quot;
@@ -707,9 +455,6 @@ class DepartmentManager(Manager):
def __init__(self, name, title):
super().__init__(name, title)
def handleRequest(self, person):
if(person.getDayOff() &gt;2 and person.getDayOff() &lt;= 5):
@@ -721,21 +466,12 @@ class DepartmentManager(Manager):
if(nextHander is not None):
nextHander.handleRequest(person)
class CEO(Manager):
&quot;CEO&quot;
def __init__(self, name, title):
super().__init__(name, title)
def handleRequest(self, person):
if (person.getDayOff() &gt; 5 and person.getDayOff() &lt;= 22):
@@ -747,29 +483,17 @@ class CEO(Manager):
if (nextHander is not None):
nextHander.handleRequest(person)
class Administrator(Manager):
&quot;行政人员&quot;
def __init__(self, name, title):
super().__init__(name, title)
def handleRequest(self, person):
print(person.getName(), &quot;的请假申请已审核,情况属实!已备案处理。处理人:&quot;, self.getName(), &quot;(&quot;, self.getTitle(), &quot;)\n&quot;)
nextHander = self.getNextHandler()
</code></pre>
<p>测试代码:</p>
@@ -789,9 +513,6 @@ class Administrator(Manager):
departmentLeader.setNextHandler(ceo)
ceo.setNextHandler(administrator)
sunny = Person(&quot;Sunny&quot;, 1, &quot;参加MDCC大会。&quot;)
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:
&quot;请求(内容)&quot;
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:
&quot;责任人的抽象类&quot;
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:
&quot;请求者&quot;
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, &quot;申请请假&quot;, request.getDayOff(), &quot;天。请假事由:&quot;, request.getReason())
@@ -999,21 +654,12 @@ class Responsible:
if (self.__leader is not None):
self.__leader.handleRequest(request)
class Supervisor(Responsible):
&quot;主管&quot;
def __init__(self, name, title):
super().__init__(name, title)
def handleRequest(self, request):
if (request.getDayOff() &lt;= 2):
@@ -1025,21 +671,12 @@ class Supervisor(Responsible):
if (nextHander is not None):
nextHander.handleRequest(request)
class DepartmentManager(Responsible):
&quot;部门总监&quot;
def __init__(self, name, title):
super().__init__(name, title)
def handleRequest(self, request):
if (request.getDayOff() &gt; 2 and request.getDayOff() &lt;= 5):
@@ -1051,21 +688,12 @@ class DepartmentManager(Responsible):
if (nextHander is not None):
nextHander.handleRequest(request)
class CEO(Responsible):
&quot;CEO&quot;
def __init__(self, name, title):
super().__init__(name, title)
def handleRequest(self, request):
if (request.getDayOff() &gt; 5 and request.getDayOff() &lt;= 22):
@@ -1077,29 +705,17 @@ class CEO(Responsible):
if (nextHander is not None):
nextHander.handleRequest(request)
class Administrator(Responsible):
&quot;行政人员&quot;
def __init__(self, name, title):
super().__init__(name, title)
def handleRequest(self, request):
print(request.getName(), &quot;的请假申请已审核,情况属实!已备案处理。处理人:&quot;, self.getName(), &quot;(&quot;, self.getTitle(), &quot;)\n&quot;)
nextHander = self.getNextHandler()
</code></pre>
<p>测试代码需要稍微修改一下:</p>
@@ -1119,9 +735,6 @@ class Administrator(Responsible):
departmentLeader.setNextHandler(ceo)
ceo.setNextHandler(administrator)
sunny = Person(&quot;Sunny&quot;)
sunny.setLeader(directLeader)
@@ -1139,9 +752,6 @@ class Administrator(Responsible):
pony.setLeader(directLeader)
pony.sendReuqest(Request(pony.getName(), 15, &quot;出国深造。&quot;))
</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>

View File

@@ -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:
&quot;房源信息&quot;
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(&quot;面积:&quot; + str(self.__area) + &quot;平米&quot;,
@@ -635,35 +419,20 @@ function hide_canvas() {
&quot;地址:&quot; + self.getAddress(),
&quot;房东:&quot; + self.getOwnerName() if isShowOwner else &quot;&quot;)
class HousingAgency:
&quot;房屋中介&quot;
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):
&quot;这里有一个将用户描述信息转换成搜索条件的逻辑。(为节省篇幅这里原样返回描述)&quot;
return description
def getMatchInfos(self, searchCondition):
&quot;根据房源信息的各个属性查找最匹配的信息。(为节省篇幅这里略去匹配的过程,全部输出)&quot;
@@ -693,9 +456,6 @@ class HousingAgency:
info.showInfo(False)
return self.__houseInfos
def signContract(self, houseInfo, time):
&quot;与房东签订协议&quot;
@@ -703,23 +463,14 @@ class HousingAgency:
print(self.getName(), &quot;与房东&quot;, houseInfo.getOwnerName(), &quot;签订&quot;, houseInfo.getAddress(),
&quot;的房子的的租赁合同,租期&quot;, time, &quot;年。 合同期内&quot;, self.getName(), &quot;有权对其进行使用和转租!&quot;)
def signContracts(self, time):
for info in self.__houseInfos :
self.signContract(info, time)
class HouseOwner:
&quot;房东&quot;
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() + &quot;&quot;, agency.getName(), &quot;发布房源出租信息:&quot;)
self.__houseInfo.showInfo()
class Custom:
&quot;房客,租房人&quot;
def __init__(self, name):
self.__name = name
def getName(self):
return self.__name
def findHouse(self, description, agency):
print(&quot;我是&quot; + self.getName() + &quot;, 我想要找一个\&quot;&quot; + description + &quot;\&quot;的房子&quot;)
@@ -783,9 +510,6 @@ class Custom:
print()
return agency.getMatchInfos(agency.getSearchCondition(description))
def seeHouse(self, houseInfos):
&quot;去看房,选择最使用的房子。(这里省略看房的过程)&quot;
@@ -793,9 +517,6 @@ class Custom:
size = len(houseInfos)
return houseInfos[size-1]
def signContract(self, houseInfo, agency, time):
&quot;与中介签订协议&quot;
@@ -803,9 +524,6 @@ class Custom:
print(self.getName(), &quot;与中介&quot;, agency.getName(), &quot;签订&quot;, houseInfo.getAddress(),
&quot;的房子的租赁合同, 租期&quot;, time, &quot;年。合同期内&quot;, self.__name, &quot;有权对其进行使用!&quot;)
</code></pre>
<p>测试代码:</p>
@@ -833,15 +551,9 @@ class Custom:
wangwu.publishHouseInfo(myHome)
print()
myHome.signContracts(3)
print()
tony = Custom(&quot;Tony&quot;)
houseInfos = tony.findHouse(&quot;18平米左右要有独卫要有窗户最好是朝南有厨房更好价位在2000左右&quot;, 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, 我想要找一个&quot;18平米左右要有独卫要有窗户最好是朝南有厨房更好价位在2000左右&quot;的房子
我爱我家 为您找以下最适合的房源:
面积: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>

View File

@@ -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:
&quot;接收包裹&quot;
def __init__(self, name):
self.__name = name
def getName(self):
return self.__name
def receive(self, parcelContent):
pass
class TonyReception(ReceiveParcel):
&quot;Tony接收&quot;
def __init__(self, name, phoneNum):
super().__init__(name)
self.__phoneNum = phoneNum
def getPhoneNum(self):
return self.__phoneNum
def receive(self, parcelContent):
print(&quot;货物主人:&quot; + self.getName() + &quot; 手机号:&quot; + self.getPhoneNum())
print(&quot;接收到一个包裹,包裹内容:&quot; + parcelContent)
class WendyReception(ReceiveParcel):
&quot;Wendy接收&quot;
def __init__(self, name, receiver):
super().__init__(name)
self.__receiver = receiver
def receive(self, parcelContent):
print(&quot;我是&quot; + self.__receiver.getName() + &quot;的朋友, 我来帮他代收快递!&quot;)
@@ -641,9 +407,6 @@ class WendyReception(ReceiveParcel):
self.__receiver.receive(parcelContent)
print(&quot;代收人:&quot; + self.getName())
</code></pre>
<p>测试代码:</p>
@@ -655,9 +418,6 @@ class WendyReception(ReceiveParcel):
wendy = WendyReception(&quot;Wendy&quot;, tony)
wendy.receive(&quot;雪地靴&quot;)
</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:
&quot;主题&quot;
def request(self):
pass
class RealSubject(Subject):
&quot;代理主题&quot;
def request(self):
print(&quot;RealSubject todo something...&quot;)
class ProxySubject(Subject):
&quot;代理主题&quot;
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(&quot;preRequest&quot;)
def afterRequest(self):
print(&quot;afterRequest&quot;)
def client():
&quot;客户端调用类&quot;
@@ -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):
&quot;Wendy接收&quot;
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(&quot;我是&quot; + self.__receiver.getName() + &quot;的朋友, 我来帮他代收快递!&quot;)
def afterReceive(self):
print(&quot;代收人:&quot; + 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>

View File

@@ -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:
&quot;&quot;
def __init__(self, name):
self.__name = name
def getName(self):
return self.__name
def wear(self):
print(&quot;我的着装是:&quot;)
class Engineer(Person):
&quot;工程师&quot;
def __init__(self, name, skill):
super().__init__(name)
self.__skill = skill
def getSkill(self):
return self.__skill
def wear(self):
print(&quot;我是&quot; + self.getSkill() + &quot;工程师&quot; + self.getName())
super().wear()
class Teacher(Person):
&quot;教师&quot;
def __init__(self, name, title):
super().__init__(name)
self.__title = title
def getTitle(self):
return self.__title
def wear(self):
print(&quot;我是&quot; + self.getName() + self.getTitle())
super().wear()
class ClothingDecorator(Person):
&quot;服装装饰器&quot;
def __init__(self, person):
self._decorated = person
def wear(self):
self._decorated.wear()
class CasualPantDecorator(ClothingDecorator):
&quot;休闲裤&quot;
def __init__(self, person):
super().__init__(person)
def wear(self):
super().wear()
print(&quot;一条卡其色休闲裤&quot;)
class BeltDecorator(ClothingDecorator):
&quot;腰带&quot;
def __init__(self, person):
super().__init__(person)
def wear(self):
super().wear()
print(&quot;一条银色针扣头的黑色腰带&quot;)
class LeatherShoesDecorator(ClothingDecorator):
&quot;皮鞋&quot;
def __init__(self, person):
super().__init__(person)
def wear(self):
super().wear()
print(&quot;一双深色休闲皮鞋&quot;)
class KnittedSweaterDecorator(ClothingDecorator):
&quot;针织毛衣&quot;
def __init__(self, person):
super().__init__(person)
def wear(self):
super().wear()
print(&quot;一件紫红色针织毛衣&quot;)
class WhiteShirtDecorator(ClothingDecorator):
&quot;白色衬衫&quot;
def __init__(self, person):
super().__init__(person)
def wear(self):
super().wear()
print(&quot;一件白色衬衫&quot;)
class GlassesDecorator(ClothingDecorator):
&quot;眼镜&quot;
def __init__(self, person):
super().__init__(person)
def wear(self):
super().wear()
print(&quot;一副方形黑框眼镜&quot;)
</code></pre>
<p>测试代码:</p>
@@ -809,25 +506,16 @@ class GlassesDecorator(ClothingDecorator):
glasses = GlassesDecorator(sweater)
glasses.wear()
print()
decorateTeacher = GlassesDecorator(WhiteShirtDecorator(LeatherShoesDecorator(Teacher(&quot;wells&quot;, &quot;教授&quot;))))
decorateTeacher.wear()
</code></pre>
<p>上面的测试代码中:</p>
<pre><code>decorateTeacher = GlassesDecorator(WhiteShirtDecorator(LeatherShoesDecorator(Teacher(&quot;wells&quot;, &quot;教授&quot;))))
</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(&quot;C:/text.txt&quot;));
DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(&quot;C:/text.txt&quot;));
</code></pre>
<p>这个写法与上面 Demo 中的</p>
<pre><code>decorateTeacher = GlassesDecorator(WhiteShirtDecorator(LeatherShoesDecorator(Teacher(&quot;wells&quot;, &quot;教授&quot;))))
</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>

View File

@@ -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:
&quot;咖啡&quot;
def __init__(self, name):
self.__name = name
def getName(self):
return self.__name
def getTaste(self):
pass
class CaffeLatte(Coffee):
&quot;拿铁咖啡&quot;
def __init__(self, name):
super().__init__(name)
def getTaste(self):
return &quot;轻柔而香醇。&quot;
class MochaCoffee(Coffee):
&quot;摩卡咖啡&quot;
def __init__(self, name):
super().__init__(name)
def getTaste(self):
return &quot;丝滑与醇厚。&quot;
class Coffeemaker:
&quot;咖啡机&quot;
@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(&quot;摩卡风味咖啡豆&quot;)
print(mocha.getName(), &quot;已为您准备好了,口感:&quot; + mocha.getTaste() + &quot;请慢慢享用!&quot;)
</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):
&quot;&quot;&quot;画笔类型&quot;&quot;&quot;
@@ -757,109 +508,58 @@ class PenType(Enum):
PenTypeRect = 2
PenTypeEllipse = 3
class Pen(metaclass=ABCMeta):
&quot;&quot;&quot;画笔&quot;&quot;&quot;
def __init__(self, name):
self.__name = name
@abstractmethod
def getType(self):
pass
def getName(self):
return self.__name
class LinePen(Pen):
&quot;&quot;&quot;直线画笔&quot;&quot;&quot;
def __init__(self, name):
super().__init__(name)
def getType(self):
return PenType.PenTypeLine
class RectanglePen(Pen):
&quot;&quot;&quot;矩形画笔&quot;&quot;&quot;
def __init__(self, name):
super().__init__(name)
def getType(self):
return PenType.PenTypeRect
class EllipsePen(Pen):
&quot;&quot;&quot;椭圆画笔&quot;&quot;&quot;
def __init__(self, name):
super().__init__(name)
def getType(self):
return PenType.PenTypeEllipse
class PenFactory:
&quot;&quot;&quot;画笔工厂类&quot;&quot;&quot;
def __init__(self):
&quot;定义一个字典(key:PenTypevaluePen)来存放对象,确保每一个类型只会有一个对象&quot;
self.__pens = {}
def getSingleObj(self, penType, name):
&quot;&quot;&quot;获得唯一实例的对象&quot;&quot;&quot;
def createPen(self, penType):
&quot;&quot;&quot;创建画笔&quot;&quot;&quot;
@@ -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(&quot;创建了 %s对象id%s 类型:%s&quot; % (ellipsePen.getName(), id(ellipsePen), ellipsePen.getType()) )
</code></pre>
<p>输出结果</p>
@@ -929,9 +623,6 @@ class PenFactory:
创建了 矩形画笔对象id61077936 类型PenType.PenTypeRect
创建了 椭圆画笔对象id61077904 类型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>

View File

@@ -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:
&quot;客户&quot;
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:
&quot;迭代器&quot;
def __init__(self, data):
self.__data = data
self.__curIdx = -1
def current(self):
return self.__data[self.__curIdx] if(len(self.__data) &gt;= self.__curIdx) else None
def next(self):
if (self.__curIdx &lt; len(self.__data) - 1):
@@ -649,19 +412,10 @@ class Iterator:
else:
return False
class NumeralSystem:
&quot;排号系统&quot;
__clinics = (&quot;1号分诊室&quot;, &quot;2号分诊室&quot;, &quot;3号分诊室&quot;)
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() + &quot;您好!您已在&quot; + self.__name+ &quot;成功挂号,序号:&quot;
+ str(customer.getNum()).zfill(4) + &quot;,请耐心等待!&quot;)
def getIterator(self):
return Iterator(self.__customers)
</code></pre>
<p>测试代码:</p>
@@ -719,9 +464,6 @@ class NumeralSystem:
tony = Customer(&quot;Tony&quot;)
tony.register(numeralSystem)
iterator = numeralSystem.getIterator()
while(iterator.next()):
@@ -729,9 +471,6 @@ class NumeralSystem:
customer = iterator.current()
print(&quot;下一位病人&quot;, str(customer.getNum()).zfill(4), customer.getName(), &quot;请到&quot;, customer.getClinic(), &quot;就诊。&quot;)
</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(&quot;下一位病人&quot;, str(customer.getNum()).zfill(4), customer.getName(),
&quot;请到&quot;, customer.getClinic(), &quot;就诊。&quot;)
</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:
&quot;迭代器&quot;
def __init__(self, data):
self.__data = data
self.toBegin()
def toBegin(self):
&quot;将指针移至起始位置&quot;
self.__curIdx = -1
def toEnd(self):
&quot;将指针移至结尾位置&quot;
self.__curIdx = len(self.__data)
def next(self):
&quot;往前移动一个元素&quot;
@@ -873,9 +594,6 @@ Tony您好您已在挂号台成功挂号序号0004请耐心等待
else:
return False
def previous(self):
&quot;往后移动一个元素&quot;
@@ -889,17 +607,11 @@ Tony您好您已在挂号台成功挂号序号0004请耐心等待
else:
return False
def current(self):
&quot;获取当前的元素&quot;
return self.__data[self.__curIdx] if (len(self.__data) &gt;= self.__curIdx) else None
</code></pre>
<p>测试代码:</p>
@@ -925,9 +637,6 @@ Tony您好您已在挂号台成功挂号序号0004请耐心等待
tony.register(numeralSystem)
print()
print(&quot;从前往后遍历:&quot;)
iterator = numeralSystem.getIterator()
@@ -937,9 +646,6 @@ Tony您好您已在挂号台成功挂号序号0004请耐心等待
customer = iterator.current()
print(&quot;下一位病人&quot;, str(customer.getNum()).zfill(4), customer.getName(), &quot;请到&quot;, customer.getClinic(), &quot;就诊。&quot;)
print(&quot;从后往前遍历:&quot;)
iterator.toEnd()
@@ -949,9 +655,6 @@ Tony您好您已在挂号台成功挂号序号0004请耐心等待
customer = iterator.current()
print(&quot;下一位病人&quot;, str(customer.getNum()).zfill(4), customer.getName(), &quot;请到&quot;, customer.getClinic(), &quot;就诊。&quot;)
</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>

View File

@@ -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:
&quot;组件,所有子配件的基类&quot;
def __init__(self, name):
self._name = name
def showInfo(self, indent = &quot;&quot;):
pass
def isComposite(self):
return False
def startup(self, indent = &quot;&quot;):
print(indent + self._name + &quot; 准备开始工作...&quot;)
def shutdown(self, indent = &quot;&quot;):
print(indent + self._name + &quot; 即将结束工作...&quot;)
class CPU(Component):
&quot;中央处理器&quot;
def __init__(self, name):
super().__init__(name)
def showInfo(self, indent):
print(indent, end=&quot;&quot;)
print(&quot;CPU:&quot; + self._name + &quot;,可以进行高速计算。&quot;)
class MemoryCard(Component):
&quot;内存条&quot;
def __init__(self, name):
super().__init__(name)
def showInfo(self, indent):
print(indent, end=&quot;&quot;)
print(&quot;内存:&quot; + self._name + &quot;,可以缓存数据,读写速度快。&quot;)
class HardDisk(Component):
&quot;硬盘&quot;
def __init__(self, name):
super().__init__(name)
def showInfo(self, indent):
print(indent, end=&quot;&quot;)
print(&quot;硬盘:&quot; + self._name + &quot;,可以永久存储数据,容量大。&quot;)
class GraphicsCard(Component):
&quot;显卡&quot;
def __init__(self, name):
super().__init__(name)
def showInfo(self, indent):
print(indent, end=&quot;&quot;)
print(&quot;显卡:&quot; + self._name + &quot;,可以高速计算和处理图形图像。&quot;)
class Battery(Component):
&quot;电源&quot;
def __init__(self, name):
super().__init__(name)
def showInfo(self, indent):
print(indent, end=&quot;&quot;)
print(&quot;电源:&quot; + self._name + &quot;,可以持续给主板和外接配件供电。&quot;)
class Fan(Component):
&quot;风扇&quot;
def __init__(self, name):
super().__init__(name)
def showInfo(self, indent):
print(indent, end=&quot;&quot;)
print(&quot;风扇:&quot; + self._name + &quot;辅助CPU散热。&quot;)
class Displayer(Component):
&quot;显示器&quot;
def __init__(self, name):
super().__init__(name)
def showInfo(self, indent):
print(indent, end=&quot;&quot;)
print(&quot;显示器:&quot; + self._name + &quot;,负责内容的显示。&quot;)
class Composite(Component):
&quot;配件组合器&quot;
def __init__(self, name):
super().__init__(name)
self._components = []
def showInfo(self, indent):
print(self._name + &quot;,由以下部件组成:&quot;)
@@ -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):
&quot;主板&quot;
def __init__(self, name):
super().__init__(name)
def showInfo(self, indent):
print(indent + &quot;主板:&quot;, end=&quot;&quot;)
super().showInfo(indent)
class ComputerCase(Composite):
&quot;机箱&quot;
def __init__(self, name):
super().__init__(name)
def showInfo(self, indent):
print(indent + &quot;机箱:&quot;, end=&quot;&quot;)
super().showInfo(indent)
class Computer(Composite):
&quot;电脑&quot;
def __init__(self, name):
super().__init__(name)
def showInfo(self, indent):
print(indent + &quot;电脑:&quot;, end=&quot;&quot;)
super().showInfo(indent)
</code></pre>
<p>测试代码:</p>
@@ -895,9 +559,6 @@ class Computer(Composite):
mainBoard.addComponent(hardDisk)
mainBoard.addComponent(graphicsCard)
battery = Battery(&quot;Antec VP 450P&quot;)
fan = Fan(&quot;DEEPCOOL 120T&quot;)
@@ -909,21 +570,12 @@ class Computer(Composite):
computerCase.addComponent(mainBoard)
computerCase.addComponent(fan)
displayer = Displayer(&quot;AOC LV243XIP&quot;)
computer = Computer(&quot;Tony DIY电脑&quot;)
computer.addComponent(displayer)
computer.addComponent(computerCase)
computer.showInfo(&quot;&quot;)
print(&quot;\n开机过程:&quot;)
@@ -933,9 +585,6 @@ class Computer(Composite):
print(&quot;\n关机过程:&quot;)
computer.shutdown(&quot;&quot;)
</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>

View File

@@ -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>

View File

@@ -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:
&quot;&quot;
def __init__(self, name, age):
self.__name = name
self.__age = age
def showMyself(self):
print(&quot;我是&quot; + self.__name + &quot;,年龄&quot; + str(self.__age) + &quot;.&quot;)
def coding(self):
print(&quot;我是码农我在Coding改变世界...&quot;)
def reading(self):
print(&quot;阅读使我快乐!知识使我成长!如饥似渴地阅读是生活的一部分...&quot;)
def fallInLove(self):
print(&quot;春风吹,月亮明,花前月下好相约...&quot;)
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:
&quot;&quot;
def __init__(self, name, age):
self.__name = name
@@ -695,9 +452,6 @@ class Person:
self.__age = age
self.__petList = []
def showMyself(self):
print(&quot;我是&quot; + self.__name + &quot;,年龄&quot; + str(self.__age) + &quot;. 我养了这些宠物:&quot;)
@@ -707,27 +461,15 @@ class Person:
print(pet + &quot;\t&quot;, end=&quot;&quot;)
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(&quot;父本tony&quot;, end=&quot;&quot;)
tony.showMyself()
tony1 = tony.deepClone()
tony1.addPet(&quot;小猫Amy&quot;)
@@ -755,9 +494,6 @@ class Person:
print(&quot;父本tony&quot;, end=&quot;&quot;)
tony.showMyself()
tony2 = tony.clone()
tony2.addPet(&quot;小兔Ricky&quot;)
@@ -769,9 +505,6 @@ class Person:
print(&quot;父本tony&quot;, end=&quot;&quot;)
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(&quot;list:&quot;, list)
print(&quot;list1:&quot;, 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:
&quot;克隆的基类&quot;
def clone(self):
&quot;浅拷贝的方式克隆对象&quot;
return copy(self)
def deepClone(self):
&quot;深拷贝的方式克隆对象&quot;
return deepcopy(self)
</code></pre>
<h4>类图</h4>
@@ -905,9 +617,6 @@ class Clone:
<pre><code class="language-python">class Person(Clone):
&quot;&quot;
def __init__(self, name, age):
self.__name = name
@@ -915,9 +624,6 @@ class Clone:
self.__age = age
self.__petList = []
def showMyself(self):
print(&quot;我是&quot; + self.__name + &quot;,年龄&quot; + str(self.__age) + &quot;. 我养了这些宠物:&quot;)
@@ -927,33 +633,18 @@ class Clone:
print(pet + &quot;\t&quot;, end=&quot;&quot;)
print()
def addPet(self, pet):
self.__petList.append(pet)
def coding(self):
print(&quot;我是码农我在Coding改变世界...&quot;)
def reading(self):
print(&quot;阅读使我快乐!知识使我成长!如饥似渴地阅读是生活的一部分...&quot;)
def fallInLove(self):
print(&quot;春风吹,月亮明,花前月下好相约...&quot;)
</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>

View File

@@ -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:
&quot;交通工具的抽象类&quot;
def running(self):
pass
class SharedBicycle(IVehicle):
&quot;共享单车&quot;
def running(self):
print(&quot;骑共享单车(轻快便捷)&quot;, end='')
class ExpressBus(IVehicle):
&quot;快速公交&quot;
def running(self):
print(&quot;坐快速公交(经济绿色)&quot;, end='')
class Express(IVehicle):
&quot;快车&quot;
def running(self):
print(&quot;打快车(快速方便)&quot;, end='')
class Subway(IVehicle):
&quot;地铁&quot;
def running(self):
print(&quot;坐地铁(高效安全)&quot;, end='')
class Classmate:
&quot;参加聚餐的同学&quot;
def __init__(self, name, vechicle):
self.__name = name
self.__vechicle = vechicle
def attendTheDinner(self):
print(self.__name + &quot; &quot;, end='')
@@ -657,9 +417,6 @@ class Classmate:
self.__vechicle.running()
print(&quot; 来参加聚餐!&quot;)
</code></pre>
<p>测试代码:</p>
@@ -683,9 +440,6 @@ class Classmate:
ruby = Classmate(&quot;Ruby&quot;, 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(&quot;Henry&quot;, Express())
henry.attendTheDinner()
</code></pre>
<h3>策略模式的模型抽象</h3>
@@ -795,9 +543,6 @@ henry.attendTheDinner()
<pre><code class="language-python">class Person:
&quot;人类&quot;
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 + &quot; &quot; + str(self.age) + &quot; years old, &quot; + str(self.weight) + &quot;kg, &quot; + str(self.height) + &quot;m.&quot;)
class ICompare:
&quot;比较算法&quot;
def comparable(self, person1, person2):
&quot;person1 &gt; person2 返回值&gt;0person1 == person2 返回0 person1 &lt; person2 返回值小于0&quot;
pass
class CompareByAge(ICompare):
&quot;通过年龄排序&quot;
def comparable(self, person1, person2):
return person1.age - person2.age
class CompareByHeight(ICompare):
&quot;通过身高进行排序&quot;
def comparable(self, person1, person2):
return person1.height - person2.height
class SortPerson:
&quot;Person的排序类&quot;
def __init__(self, compare):
self.__compare = compare
def sort(self, personList):
&quot;排序算法,这里采用最简单的冒泡排序&quot;
@@ -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():
&quot;用Python的方式对Person进行排序&quot;
personList = [
Person(&quot;Tony&quot;, 2, 54.5, 0.82),
@@ -999,9 +693,6 @@ def testPersonListInPython():
Person(&quot;Helen&quot;, 16, 45.7, 1.60)
]
# 使用使用operator模块根据年龄进行排序
print(&quot;根据年龄进行排序后的结果:&quot;)
@@ -1013,9 +704,6 @@ def testPersonListInPython():
person.showMysef()
print()
print(&quot;根据身高进行排序后的结果:&quot;)
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):
&quot;根据身高和体重的综合情况来排序(身高和体重的权重分别是0.6和0.4)&quot;
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>

View File

@@ -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:
&quot;工程师&quot;
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 + &quot;工作太忙了,都忘记要做什么了!&quot;)
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 + &quot;想起要做什么了!&quot;)
def showWorkItem(self):
if(len(self.__workItems)):
@@ -625,57 +403,30 @@ function hide_canvas() {
else:
print(self.__name + &quot;暂无工作项!&quot;)
class TodoList:
&quot;工作项&quot;
def __init__(self):
self.__workItems = []
def writeWorkItem(self, item):
self.__workItems.append(item)
def getWorkItems(self):
return self.__workItems
class TodoListCaretaker:
&quot;TodoList管理类&quot;
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:
&quot;备忘录&quot;
def setAttribute(self, dict):
&quot;深度拷贝字典dict中的所有属性&quot;
self.__dict__ = deepcopy(dict)
def getAttribute(self):
&quot;获取属性字典&quot;
return self.__dict__
class Caretaker:
&quot;备忘录管理类&quot;
def __init__(self):
self._mementos = {}
def addMemento(self, name, memento):
self._mementos[name] = memento
def getMemento(self, name):
return self._mementos[name]
class Originator:
&quot;备份发起人&quot;
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):
&quot;终端命令&quot;
def __init__(self, text):
self.__cmdName = &quot;&quot;
@@ -925,9 +616,6 @@ class TerminalCmd(Originator):
self.__cmdArgs = []
self.parseCmd(text)
def parseCmd(self, text):
&quot;从字符串中解析命令&quot;
@@ -939,31 +627,19 @@ class TerminalCmd(Originator):
if(len(subStrs) &gt; 0):
self.__cmdName = subStrs[0]
# 获取第一个字段之后的所有字符作为命令的参数
if (len(subStrs) &gt; 1):
self.__cmdArgs = subStrs[1:]
def getArgumentsFromString(self, str, splitFlag):
&quot;通过splitFlag进行分割获得参数数组.&quot;
if (splitFlag == &quot;&quot;):
print(&quot;splitFlag is empty!&quot;)
return &quot;&quot;
data = str.split(splitFlag)
result = []
@@ -975,25 +651,13 @@ class TerminalCmd(Originator):
if (item != &quot;&quot;):
result.append(item)
return result;
def showCmd(self):
print(self.__cmdName, self.__cmdArgs)
class TerminalCaretaker(Caretaker):
&quot;终端的备忘录管理类&quot;
def showHistoryCmds(self):
&quot;显示历史命令&quot;
@@ -1013,9 +677,6 @@ class TerminalCaretaker(Caretaker):
value = obj._TerminalCmd__cmdArgs
print(&quot;&quot; + str(key) + &quot;条命令: &quot; + str(name) + &quot; &quot; + 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>

View File

@@ -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:
&quot;颜料&quot;
def __init__(self, color):
self.__color = color
self.__user = &quot;&quot;
def getColor(self):
return self.__color
def setUser(self, user):
self.__user = user
return self
def showInfo(self):
print(self.__user + &quot;取得&quot; + self.__color + &quot;色颜料&quot;)
class PigmengFactory:
&quot;资料的工厂类&quot;
def __init__(self):
self.__sigmentSet = {
@@ -623,9 +398,6 @@ class PigmengFactory:
&quot;&quot;: Pigment(&quot;&quot;),
}
def getPigment(self, color):
pigment = self.__sigmentSet.get(color)
@@ -635,9 +407,6 @@ class PigmengFactory:
logging.error(&quot;没有%s颜色的颜料&quot;, color)
return pigment
</code></pre>
<p>测试代码:</p>
@@ -661,9 +430,6 @@ class PigmengFactory:
pigmentBlue2 = factory.getPigment(&quot;&quot;).setUser(&quot;和平队&quot;)
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):
&quot;享元类&quot;
@abstractmethod
def operation(self, extrinsicState):
pass
class FlyweightImpl(Flyweight):
&quot;享元类的具体实现类&quot;
def __init__(self, color):
self.__color = color
def operation(self, extrinsicState):
print(extrinsicState + &quot;取得&quot; + self.__color + &quot;色颜料&quot;)
class FlyweightFactory:
&quot;享元工厂&quot;
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(&quot;&quot;)
pigmentBlue2.operation(&quot;和平队&quot;)
</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>

View File

@@ -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:
&quot;入学报到&quot;
def register(self, name):
print(&quot;活动中心:&quot; + name + &quot;同学报到成功!&quot;)
class Payment:
&quot;缴费&quot;
def pay(self, name, money):
print(&quot;缴费中心:&quot; + &quot;收到&quot; + name + &quot;同学&quot; + str(money) + &quot;元付款,缴费成功!&quot;)
class DormitoryManagementCenter:
&quot;宿舍管理中心(生活中心)&quot;
def provideLivingGoods(self, name):
print(&quot;生活中心:&quot; + name + &quot;同学的生活用品已发放。&quot;)
class Dormitory:
&quot;宿舍&quot;
def meetRoommate(self, name):
print(&quot;宿 舍:&quot; + &quot;大家好!这是刚来的&quot; + name + &quot;同学,是你们未来需要共度四年的室友!相互认识一下……&quot;)
class Volunteer:
&quot;迎新志愿者&quot;
def __init__(self, name):
self.__name = name
@@ -643,9 +412,6 @@ class Volunteer:
self.__lifeCenter = DormitoryManagementCenter()
self.__dormintory = Dormitory()
def welcomeFreshmen(self, name):
print(&quot;你好,&quot; + name + &quot;同学! 我是新生报到的志愿者&quot; + 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(&quot;Frank&quot;)
volunteer.welcomeFreshmen(&quot;Tony&quot;)
</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:
&quot;ZIP模块负责ZIP文件的压缩与解压&quot;
def compress(self, srcFilePath, dstFilePath):
print(&quot;ZIP模块正在进行 '&quot; + srcFilePath + &quot;' 文件的压缩......&quot;)
print(&quot;文件压缩成功,已保存至 '&quot; + dstFilePath + &quot;'&quot;)
def decompress(self, srcFilePath, dstFilePath):
print(&quot;ZIP模块正在进行 '&quot; + srcFilePath + &quot;' 文件的解压......&quot;)
print(&quot;文件解压成功,已保存至 '&quot; + dstFilePath+ &quot;'&quot;)
class RARModel:
&quot;RAR模块负责ZIP文件的压缩与解压&quot;
def compress(self, srcFilePath, dstFilePath):
print(&quot;RAR模块正在进行 '&quot; + srcFilePath + &quot;' 文件的压缩......&quot;)
print(&quot;文件压缩成功,已保存至 '&quot; + dstFilePath + &quot;'&quot;)
def decompress(self, srcFilePath, dstFilePath):
print(&quot;RAR模块正在进行 '&quot; + srcFilePath + &quot;' 文件的解压......&quot;)
print(&quot;文件解压成功,已保存至 '&quot; + dstFilePath + &quot;'&quot;)
class ZModel:
&quot;7Z模块负责7Z文件的压缩与解压&quot;
def compress(self, srcFilePath, dstFilePath):
print(&quot;7Z模块正在进行 '&quot; + srcFilePath + &quot;' 文件的压缩......&quot;)
print(&quot;文件压缩成功,已保存至 '&quot; + dstFilePath + &quot;'&quot;)
def decompress(self, srcFilePath, dstFilePath):
print(&quot;7Z模块正在进行 '&quot; + srcFilePath + &quot;' 文件的解压......&quot;)
print(&quot;文件解压成功,已保存至 '&quot; + dstFilePath + &quot;'&quot;)
class CompressionFacade:
&quot;压缩系统的外观类&quot;
def __init__(self):
self.__zipModel = ZIPModel()
@@ -851,9 +575,6 @@ class CompressionFacade:
self.__rarModel = RARModel()
self.__zModel = ZModel()
def compress(self, srcFilePath, dstFilePath, type):
&quot;根据不同的压缩类型,压缩成不同的格式&quot;
@@ -883,9 +604,6 @@ class CompressionFacade:
return False
return True
def decompress(self, srcFilePath, dstFilePath):
&quot;从srcFilePath中获取后缀根据不同的后缀名(拓展名),进行不同格式的解压&quot;
@@ -913,9 +631,6 @@ class CompressionFacade:
return False
return True
</code></pre>
<p><strong>测试代码:</strong></p>
@@ -933,9 +648,6 @@ class CompressionFacade:
&quot;E:\解析文件\生活中的外观模式——学妹别慌,学长帮你.md&quot;)
print()
facade.compress(&quot;E:\生活中的设计模式\生活中的外观模式——学妹别慌,学长帮你.md&quot;,
&quot;E:\压缩文件\生活中的外观模式——学妹别慌,学长帮你&quot;, &quot;rar&quot;)
@@ -945,9 +657,6 @@ class CompressionFacade:
&quot;E:\解析文件\生活中的外观模式——学妹别慌,学长帮你.md&quot;)
print()
facade.compress(&quot;E:\生活中的设计模式\生活中的外观模式——学妹别慌,学长帮你.md&quot;,
&quot;E:\压缩文件\生活中的外观模式——学妹别慌,学长帮你&quot;, &quot;7z&quot;)
@@ -957,9 +666,6 @@ class CompressionFacade:
&quot;E:\解析文件\生活中的外观模式——学妹别慌,学长帮你.md&quot;)
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 的魔数是 PK50 4B 03 04RAR 的魔数是 Rar52 61 727z 的魔数是 7z37 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>

View File

@@ -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:
&quot;《从生活的角度解读设计模式》一书&quot;
@@ -577,57 +370,30 @@ class DesignPatternBook:
def getName(self):
return &quot;《从生活的角度解读设计模式》&quot;
class Reader(metaclass=ABCMeta):
&quot;访问者,也就是读者&quot;
@abstractmethod
def read(self, book):
pass
class Engineer(Reader):
def read(self, book):
print(&quot;技术狗读&quot; + book.getName() + &quot;一书后的感受:能抓住模式的核心思想,深入浅出,很有见地!&quot;)
class ProductManager(Reader):
&quot;产品经理&quot;
def read(self, book):
print(&quot;产品经理读&quot; + book.getName() + &quot;一书后的感受:配图非常有趣,文章很有层次感!&quot;)
class OtherFriend(Reader):
&quot;IT圈外的朋友&quot;
def read(self, book):
print(&quot;IT圈外的朋友读&quot; + book.getName() + &quot;一书后的感受:技术的内容一脸蒙蔽,但故事很精彩,像是看小说或是故事集!&quot;)
</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):
&quot;数据结构类&quot;
def accept(self, visitor):
&quot;接受访问者的访问&quot;
visitor.visit(self)
class Visitor(metaclass=ABCMeta):
&quot;访问者&quot;
@abstractmethod
def visit(self, data):
@@ -713,27 +461,15 @@ class Visitor(metaclass=ABCMeta):
&quot;对数据对象的访问操作&quot;
pass
class ObjectStructure:
&quot;数据结构的管理类,也是数据对象的一个容器,可遍历容器内的所有元素&quot;
def __init__(self):
self.__datas = []
def add(self, dataElement):
self.__datas.append(dataElement)
def action(self, visitor):
&quot;进行数据访问的操作&quot;
@@ -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:
&quot;《从生活的角度解读设计模式》一书&quot;
def getName(self):
return &quot;《从生活的角度解读设计模式》&quot;
class Engineer(Visitor):
def visit(self, book):
print(&quot;技术狗读&quot; + book.getName() + &quot;一书后的感受:能抓住模式的核心思想,深入浅出,很有见地!&quot;)
class ProductManager(Visitor):
&quot;产品经理&quot;
def visit(self, book):
print(&quot;产品经理读&quot; + book.getName() + &quot;一书后的感受:配图非常有趣,文章很有层次感!&quot;)
class OtherFriend(Visitor):
&quot;IT圈外的朋友&quot;
def visit(self, book):
print(&quot;IT圈外的朋友读&quot; + book.getName() + &quot;一书后的感受:技术的内容一脸蒙蔽,但故事很精彩,像是看小说或是故事集!&quot;)
</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):
&quot;动物类&quot;
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):
&quot;&quot;
def __init__(self, name, isMale, age, weight):
super().__init__(name, isMale, age, weight)
def speak(self):
print(&quot;miao~&quot;)
class Dog(Animal):
&quot;&quot;
def __init__(self, name, isMale, age, weight):
super().__init__( name, isMale, age, weight)
def speak(self):
print(&quot;wang~&quot;)
class GenderCounter(Visitor):
&quot;性别统计&quot;
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(&quot;Not support this type&quot;)
def getInfo(self):
print(str(self.__maleCat) + &quot;只雄猫,&quot; + str(self.__femaleCat) + &quot;只雌猫,&quot;
+ str(self.__maleDog) + &quot;只雄狗,&quot; + str(self.__femalDog) + &quot;只雌狗。&quot;)
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(&quot;Not support this type&quot;)
def getInfo(self):
print(&quot;猫的平均体重是:%0.2fkg 狗的平均体重是:%0.2fkg&quot; %
((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(&quot;Not support this type&quot;)
def getInfo(self):
print(&quot;猫的最大年龄是:&quot; + str(self.__catMaxAge) + &quot; 狗的最大年龄是:&quot; + 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>

View File

@@ -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>

View File

@@ -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:
&quot;&quot;&quot;过滤网&quot;&quot;&quot;
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(&quot;过滤后:&quot;, 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(&quot;过滤后:&quot;, filteredMaterials)
def isSoybeanMilk(material):
return material == &quot;豆浆&quot;
</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):
&quot;&quot;&quot;过滤器&quot;&quot;&quot;
@abstractmethod
def doFilter(self, elements):
@@ -691,41 +463,23 @@ class Filter(metaclass=ABCMeta):
&quot;&quot;&quot;过滤方法&quot;&quot;&quot;
pass
class FilterChain(Filter):
&quot;过滤器链&quot;
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):
&quot;&quot;&quot;过滤网&quot;&quot;&quot;
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):
&quot;&quot;&quot;敏感词过滤&quot;&quot;&quot;
def __init__(self):
self.__sensitives = [&quot;黄色&quot;, &quot;台独&quot;, &quot;贪污&quot;]
def doFilter(self, elements):
# 敏感词列表转换成正则表达式
@@ -827,9 +566,6 @@ class SensitiveFilter(Filter):
regex += word + &quot;|&quot;
regex = regex[0: len(regex) - 1]
# 对每个元素进行过滤
newElements = []
@@ -839,19 +575,10 @@ class SensitiveFilter(Filter):
item, num = re.subn(regex, &quot;&quot;, element)
newElements.append(item)
return newElements
class HtmlFilter(Filter):
&quot;HTML特殊字符转换&quot;
def __init__(self):
self.__wordMap = {
@@ -867,9 +594,6 @@ class HtmlFilter(Filter):
&quot;\&quot;&quot;: &quot; &amp;quot;&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(&quot;过滤后的内容:&quot;, newContents)
</code></pre>
<p><strong>输出结果:</strong></p>
@@ -921,9 +639,6 @@ class HtmlFilter(Filter):
<pre><code>过滤前的内容: ['有人出售黄色书:&lt;黄情味道&gt;', '有人企图搞台独活动, ——&quot;造谣咨询&quot;']
过滤后的内容: ['有人出售书:&amp;lt;黄情味道&amp;gt;', '有人企图搞活动, —— &amp;quot;造谣咨询 &amp;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>

View File

@@ -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:
&quot;移动电源&quot;
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(&quot;序列号:&quot; + str(self.__serialNum) + &quot; 电量:&quot; + str(self.__electricQuantity) + &quot;% 使用者:&quot; + self.__user)
class ObjectPack:
&quot;对象的包装类,封装指定的对象(如充电宝)是否被使用中&quot;
@@ -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:
&quot;存放移动电源的智能箱盒&quot;
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):
&quot;使用移动电源&quot;
@@ -679,9 +436,6 @@ class PowerBankBox:
print(str(serialNum) + &quot;电源已被借用!&quot;)
return result
def giveBack(self, serialNum):
&quot;归还移动电源&quot;
@@ -693,9 +447,6 @@ class PowerBankBox:
item.setUsing(False)
print(str(serialNum) + &quot;电源已归还!&quot;)
</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:
&quot;池对象,也称池化对象&quot;
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):
&quot;对象池&quot;
&quot;对象池初始化大小&quot;
InitialNumOfObjects = 10
@@ -857,9 +578,6 @@ class ObjectPool(metaclass=ABCMeta):
&quot;对象池最大的大小&quot;
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):
&quot;子类提供创建对象的方法&quot;
pass
def borrowObject(self):
# 如果找到空闲对象,直接返回
@@ -893,9 +605,6 @@ class ObjectPool(metaclass=ABCMeta):
logging.info(&quot;%s对象已被借用, time:%d&quot;, id(obj), time.time())
return obj
# 如果对象池未满,则添加新的对象
if(len(self.__pools) &lt; ObjectPool.MaxNumOfObjects):
@@ -909,15 +618,9 @@ class ObjectPool(metaclass=ABCMeta):
logging.info(&quot;%s对象已被借用, time:%d&quot;, 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(&quot;%s对象已归还, time:%d&quot;, id(pooledObj.getObject()), time.time())
break
def addObject(self):
obj = None
@@ -945,15 +645,9 @@ class ObjectPool(metaclass=ABCMeta):
logging.info(&quot;添加新对象%s, time:%d&quot;, id(obj), time.time())
return obj
def clear(self):
self.__pools.clear()
def _findFreeObject(self):
&quot;查找空闲的对象&quot;
@@ -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:
&quot;移动电源&quot;
def __init__(self, serialNum, electricQuantity):
self.__serialNum = serialNum
@@ -1001,47 +689,23 @@ class ObjectPool(metaclass=ABCMeta):
self.__electricQuantity = electricQuantity
self.__user = &quot;&quot;
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(&quot;序列号:%03d 电量:%d%% 使用者:%s&quot; % (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(&quot;Aimee&quot;)
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>

View File

@@ -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:
&quot;&quot;&quot;公司员工&quot;&quot;&quot;
def __init__(self, name):
self.__name = name
def doPerformance(self, skill):
print(self.__name + &quot;的表演:&quot;, end=&quot;&quot;)
skill()
def sing():
&quot;&quot;&quot;唱歌&quot;&quot;&quot;
print(&quot;唱一首歌&quot;)
def dling():
&quot;&quot;&quot;拉Ukulele&quot;&quot;&quot;
print(&quot;拉一曲Ukulele&quot;)
def joke():
&quot;&quot;&quot;说段子&quot;&quot;&quot;
print(&quot;说一搞笑段子&quot;)
def performMagicTricks():
&quot;&quot;&quot;表演魔术&quot;&quot;&quot;
print(&quot;神秘魔术&quot;)
def skateboarding():
&quot;&quot;&quot;玩滑板&quot;&quot;&quot;
print(&quot;酷炫滑板&quot;)
</code></pre>
<p>测试代码:</p>
@@ -643,9 +415,6 @@ def skateboarding():
Kerry = Employee(&quot;Kerry&quot;)
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 &gt; 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(&quot;所有的偶数:&quot;, list1)
print(&quot;大于10的数&quot;, 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 &gt; 10, elements))
</code></pre>
<h3>面向对象的方式实现回调机制</h3>
@@ -771,15 +519,9 @@ list2 = list(filter(lambda x: x &gt; 10, elements))
<pre><code class="language-python">from abc import ABCMeta, abstractmethod
# 引入ABCMeta和abstractmethod来定义抽象类和抽象方法
class Skill(metaclass=ABCMeta):
&quot;&quot;&quot;技能的抽象类&quot;&quot;&quot;
@abstractmethod
def performance(self):
@@ -787,29 +529,17 @@ class Skill(metaclass=ABCMeta):
&quot;&quot;&quot;技能表演&quot;&quot;&quot;
pass
class NewEmployee:
&quot;&quot;&quot;公司新员工&quot;&quot;&quot;
def __init__(self, name):
self.__name = name
def doPerformance(self, skill):
print(self.__name + &quot;的表演:&quot;, end=&quot;&quot;)
skill.performance()
class Sing(Skill):
&quot;&quot;&quot;唱歌&quot;&quot;&quot;
@@ -817,9 +547,6 @@ class Sing(Skill):
def performance(self):
print(&quot;唱一首歌&quot;)
class Joke(Skill):
&quot;&quot;&quot;说段子&quot;&quot;&quot;
@@ -827,9 +554,6 @@ class Joke(Skill):
def performance(self):
print(&quot;说一搞笑段子&quot;)
class Dling(Skill):
&quot;&quot;&quot;拉Ukulele&quot;&quot;&quot;
@@ -837,9 +561,6 @@ class Dling(Skill):
def performance(self):
print(&quot;拉一曲Ukulele&quot;)
class PerformMagicTricks(Skill):
&quot;&quot;&quot;表演魔术&quot;&quot;&quot;
@@ -847,9 +568,6 @@ class PerformMagicTricks(Skill):
def performance(self):
print(&quot;神秘魔术&quot;)
class Skateboarding(Skill):
&quot;&quot;&quot;玩滑板&quot;&quot;&quot;
@@ -857,9 +575,6 @@ class Skateboarding(Skill):
def performance(self):
print(&quot;酷炫滑板&quot;)
</code></pre>
<p><strong>测试代码:</strong></p>
@@ -885,9 +600,6 @@ class Skateboarding(Skill):
Kerry = NewEmployee(&quot;Kerry&quot;)
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 + &quot;的表演:&quot;);
@@ -943,9 +646,6 @@ public class NewEmployee {
skill.performance();
}
/**
* 用Main方法来测试
@@ -969,9 +669,6 @@ public class NewEmployee {
}
});
NewEmployee frank = new NewEmployee(&quot;Frank&quot;);
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>

View File

@@ -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>

View File

@@ -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()&lt;&lt;(QString(&quot;slot_onChannelUserJoined, uid:%1&quot;).arg(uid));
}
void ClassWidget::slot_onChannelUserLeaved(QString uid)
{
@@ -977,9 +758,6 @@ void ClassWidget::slot_onChannelUserLeaved(QString uid)
qDebug()&lt;&lt;(QString(&quot;slot_onChannelUserLeaved, uid:%1&quot;).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-&gt;widgetNoData-&gt;show();
}
</code></pre>
<p>重构后的代码:</p>
@@ -1171,9 +940,6 @@ default:
break;
}
</code></pre>
<p>这时其实可以进行进一步的重构,就是每一个 case 里的代码段都提炼成一个方法(函数)。</p>
@@ -1205,9 +971,6 @@ if(pItem &amp;&amp; pItem-&gt;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>