享元设计模式
简单介绍
享元设计模式的基本原则就是多个对象共享一个类(Class
)
享元模式的应用场景很多,比如,你要做邮箱,对于一个职场人士来讲,邮箱必须便捷,容错率高,渲染时间短,这时你就可以运用享元!享元会共享同一块内存,减少渲染时间
实现
在以下实例里,我们会模拟渲染邮件的过程
定义主类
邮件类,就叫他Email
类吧!
Email类有几个参数
- author 邮件发送人
- addressee 收件人
- topic 邮件标题
- time 邮件发送时间
- content 邮件内容
也就说,定义类的代码应该是
class Email:
def __init__(self, author, addressee, topic, time, content):
"""初始化邮件内容"""
self.author = author
self.addressee = addressee
self.topic = topic
self.time = time
self.content = content
我们还得定义一个用来接受邮件的函数,设置为__str__
...
def __str__(self):
"""返回邮件内容"""
result = """
发件人: {}
收件人: {}
标题: {}
发送时间: {}
内容:
{}
""".format(self.author, self.addressee, self.topic, self.time)
return result
Email
类型的完整代码如下:
class Email:
def __init__(self, author, addressee, topic, time, content):
"""初始化邮件内容"""
self.author = author
self.addressee = addressee
self.topic = topic
self.time = time
self.content = content
def __str__(self):
"""返回邮件内容"""
result = """
发件人: {}
收件人: {}
标题: {}
发送时间: {}
内容:
{}
""".format(self.author, self.addressee, self.topic, self.time, self.content)
return result
实现管理邮件类
管理邮件类被叫做EmailManage
完整代码如下
class EmailManage:
def __init__(self):
self.EmailList = []
def add(self, author, addressee, topic, time, content):
"""添加邮件"""
self.EmailList.append(Email(self, author, addressee, topic, time, content))
def search(self, author):
"""查询邮件"""
for i in self.EmailList:
if author in str(i).split('\n')[1]:
return str(i)
主函数main
def main():
emailmanage = EmailManage()
while True:
chose = input("请选择你的操作:\n1.添加邮件\n2.查询邮件\n")
if chose == '1':
author = input("请输入姓名:")
addressee = input("请输入收件人:")
topic = input("请输入主题:")
time = input('请输入时间:')
content = input('请输入内容:')
emailmanage.add(author, addressee, topic, time, content)
elif chose == '2':
author = input("请输入姓名:")
result = emailmanage.search(author)
if result:
print('-'*9, author, '-'*9)
print(result)
else:
print('没有此人!')
main()
完整代码
完整代码如下:
class Email:
def __init__(self, author, addressee, topic, time, content):
"""初始化邮件内容"""
self.author = author
self.addressee = addressee
self.topic = topic
self.time = time
self.content = content
def __str__(self):
"""返回邮件内容"""
result = """
发件人: {}
收件人: {}
标题: {}
发送时间: {}
内容:
{}
""".format(self.author, self.addressee, self.topic, self.time, self.content)
return result
class EmailManage:
def __init__(self):
self.EmailList = []
def add(self, author, addressee, topic, time, content):
"""添加邮件"""
self.EmailList.append(Email(author, addressee, topic, time, content))
def search(self, author):
"""查询邮件"""
for i in self.EmailList:
if author in str(i).split('\n')[1]:
return str(i)
def main():
emailmanage = EmailManage()
while True:
chose = input("请选择你的操作:\n1.添加邮件\n2.查询邮件\n")
if chose == '1':
author = input("请输入姓名:")
addressee = input("请输入收件人:")
topic = input("请输入主题:")
time = input('请输入时间:')
content = input('请输入内容:')
emailmanage.add(author, addressee, topic, time, content)
elif chose == '2':
author = input("请输入姓名:")
result = emailmanage.search(author)
if result:
print('-'*9, author, '-'*9)
print(result)
else:
print('没有此人!')
main()
运行效果
这些代码是真实可运行的
运行结果如下:
PS D:\优快云掘金> & C:/Users/S.X.Y/AppData/Local/Programs/Python/Python38-32/python.exe d:/优快云掘金/享元.py
请选择你的操作:
1.添加邮件
2.查询邮件
1
请输入姓名:test_author
请输入收件人:test_a
请输入主题:test_topic
请输入时间:test_time
请输入内容:test_content
请选择你的操作:
1.添加邮件
2.查询邮件
2
请输入姓名:test_author
--------- test_author ---------
发件人: test_author
收件人: test_a
标题: test_topic
发送时间: test_time
内容:
test_content
请选择你的操作:
1.添加邮件
2.查询邮件
2
请输入姓名:test_content
没有此人!
请选择你的操作:
1.添加邮件
2.查询邮件
提示
享元模式还得满足以下条件:
- 需要共享的对象数据不需要变化
- 几个类似的对象必须要共享一个
Class
例如上述代码,邮件的对象其实都是Email
类
享元模式的使用场景非常多,这里就不过多赘述,希望此文对大家有帮助