类的封装性: 让门面设计模式来打开这扇门

要想在图书馆有座位,一是起的比别人早,二是看运气,运气不好可能遇到闭馆,运气好可能去刚好有人离座,然后你坐下。光靠第二个运气是不靠谱的,但是第一个能够显著的增加你的运气

为复杂系统提供一个更简单的统一接口。它通过提供单一入口点,让客户端访问底层系统的功能变得更加容易

封装稀碎繁琐的操作,是引入类的好时机,体现类封装性的一个模式。

电脑启动案例

用户(客户端)只需要按一个按钮能启动电脑,但实际上背后有很多操作和流程(比如将程序从磁盘加载到内存)。

在这个例子中,按钮就是启动电脑所有底层流程的统一接口,提供给用户的一个门面,用户不需要关注底层系统的细节。

没有门面时,用户需要这样做,都是琐碎的细节

python 复制代码
# 没有门面时,用户需要这样做:
cpu = CPU()
mem = Memory()
ssd = SolidStateDrive()

# 都是琐碎的细节
cpu.freeze()
data = ssd.read("100", "1024")
mem.load("0x00", data)
cpu.jump("0x00")
cpu.execute()

实现

python 复制代码
class CPU:
    def freeze(self):
        print("正在冻结处理器。")

    def jump(self, position: str):
        print("正在跳转到:", position)

    def execute(self):
        print("正在执行。")


class Memory:
    def load(self, position: str, data: str):
        print(f"加载数据:'{data}'到 内存'{position}'位置")


class SolidStateDrive:
    """固态硬盘"""

    def read(self, lba: str, size: str):
        return f"从扇区 {lba} 读取, {size} 大小的数据"


class Computer:
    """门面设置模式"""

    def __init__(self):
        self.cpu = CPU()
        self.memory = Memory()
        self.ssd = SolidStateDrive()

    def start(self):
        self.cpu.freeze()
        self.memory.load("0x00", self.ssd.read("0x00", "1024"))


def client_use():
    """客户端使用

    Examples:
        >>> computer = Computer()
        >>> computer.start()
        正在冻结处理器。
        加载数据:'从扇区 0x00 读取, 1024 大小的数据'到 内存'0x00'位置
    """


if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose=True)

小结

对于Python这种灵活的语言,它既能够轻松的使用函数完成功能,也能像Java一样封装类。

当我们使用Python函数处理的时候,如果发现太多分散的函数子功能共同协作来完成某个功能的时候,此时就可以考虑使用类封装起来了,而封装的结果就是函数转类,体现类的封装性,简化客户端的操作。

参考

相关推荐
笃行3509 小时前
向量数据库单独建一套,这笔账划不划算
后端
weixin_4316004410 小时前
Agent Workflow 学习向:Code 节点,比模板更强的变量加工
后端·python·学习·ai·
Rain的Java大神之路10 小时前
短信接口被狂刷怎么处理
java·运维·后端·web安全·面试·架构·xss
Lost of 程序猿11 小时前
AOP 实战:面向切面编程从理论到落地
后端·asp.net·aop·面向切片变成
Lost of 程序猿11 小时前
ASP.NET Core 认证授权实战:从 JWT 到 Policy,设计一套企业级 RBAC 权限系统
后端·asp.net
Lost of 程序猿11 小时前
ASP.NET Core 后台任务全景:从 BackgroundService 到 Channel 队列,再到分布式调度
后端·asp.net·.netcore
倾颜12 小时前
NestJS 核心概念梳理:从 Module、Controller 到 Guard、Interceptor
后端·node.js·nestjs
东风破_12 小时前
JWT 1:从一个登录请求开始,理解 React 项目里的 API 层与 Mock
前端·后端
东风破_12 小时前
JWT 3:为什么 Token 要放进 Authorization?Axios 拦截器到底解决了什么?
前端·后端
东风破_12 小时前
JWT 5:路由守卫是什么?把整个 JWT 登录鉴权流程串起来
前端·后端