[PyData] 02 - Data Preprocessing and Cleaning

时间:2021-07-29 22:59:42

前言


参考资源

史上最全设计模式导学目录(完整版)

只把常用的五星的掌握即可。

  

外观模式-Facade Pattern【学习难度:★☆☆☆☆,使用频率:★★★★★】

深入浅出外观模式(一):外观模式概述,外观模式结构与实现

深入浅出外观模式(二):外观模式应用实例(文件加密模块)

深入浅出外观模式(三):抽象外观类,外观模式效果与适用场景

系统越来越复杂,但不想让客户看到,对外仍然体现出“简洁”。

教学


一、基本原理

提供了一名“服务员”统一办理这些歌事情。

[PyData] 02 - Data Preprocessing and Cleaning

二、类图

类关系表示

类关系参见: https://www.cnblogs.com/jesse123/p/4279555.html

  • Association:

将一个类的对象作为另一个类的属性;

  • 菱形尾巴 + Association:

[Aggregation]:集合体,但也只是集合,弱关系 ----> has-a,老师和学生的关系,学生可以属于多位老师;

[Composition]:组合体,必不可少部分,强关系 ----> contain-a,皇帝和妃子的关系,妃子只能属于一位皇帝;

  • 实虚结合 + 三角 (类) 箭头:

[Generalization]:实现继承;

[Realization]:实现接口;

  • 虚化的 Association:  

[Dependency]:仅使用了对方的 “方法”;

Aggregation 与 Composition

要点:

如果是“必要的”,那么就需要在类内“create”了呢。

如果只是“弱弱地使用”,那么“部分“ 可以在外部创建,再以参数形式传入 "整体” 使用。

[PyData] 02 - Data Preprocessing and Cleaning

三、外观模式

外观模式 UML

[PyData] 02 - Data Preprocessing and Cleaning

外观模式 Code

要点:虽然使用了其他类(SubSystem),但属于“类的属性”,并不是在方法内。

class SubSystemA
{
public void MethodA()
{
//业务实现代码
}
} class SubSystemB
{
public void MethodB()
{
//业务实现代码
}
} class SubSystemC
{
public void MethodC()
{
//业务实现代码
}
} class Facade
{
# 类只是作为了属性,所以属于 Association
private SubSystemA obj1 = new SubSystemA();
private SubSystemB obj2 = new SubSystemB();
private SubSystemC obj3 = new SubSystemC(); public void Method()
{
obj1.MethodA();
obj2.MethodB();
obj3.MethodC();
}
} class Program
{
static void Main(string[] args)
{
Facade facade = new Facade();
facade.Method();
}
}

Facade Pattern in Python


一、虚基类

abc.ABCMeta 是一个metaclass,用于在Python程序中创建抽象基类。

@abstractmethod 装饰器:其实就是模仿“虚函数”。

详见:[Advanced Python] 15 - Metaclass for ORM

class Server(metaclass=ABCMeta):

    @abstractmethod
def __init__(self):
pass def __str__(self):
return self.name @abstractmethod
def boot(self):
pass @abstractmethod
def kill(self, restart=True):
pass

钩子类,实际操作的细节实现。

class FileServer(Server):

    def __init__(self):
'''初始化文件服务进程要求的操作'''
self.name = 'FileServer'
self.state = State.new def boot(self):
print('booting the {}'.format(self))
'''启动文件服务进程要求的操作'''
self.state = State.running def kill(self, restart=True):
print('Killing {}'.format(self))
'''杀死文件服务进程要求的操作'''
self.state = State.restart if restart else State.zombie def create_file(self, user, name, permissions):
'''检查访问权限的有效性、用户权限,等等''' print("trying to create the file '{}' for user '{}' with permissions {}".format(name, user, permissions)) class ProcessServer(Server): def __init__(self):
'''初始化进程服务进程要求的操作'''
self.name = 'ProcessServer'
self.state = State.new def boot(self):
print('booting the {}'.format(self))
'''启动进程服务进程要求的操作'''
self.state = State.running def kill(self, restart=True):
print('Killing {}'.format(self))
'''杀死进程服务进程要求的操作'''
self.state = State.restart if restart else State.zombie def create_process(self, user, name):
'''检查用户权限、生成PID,等等''' print("trying to create the process '{}' for user '{}'".format(name, user))

在外观类中,初始化的部分,挂上类钩子;对外API函数,调用这些类的函数钩子。

class OperatingSystem:

    '''外观'''

    def __init__(self):
self.fs = FileServer()
self.ps = ProcessServer() def start(self):
[i.boot() for i in (self.fs, self.ps)] def create_file(self, user, name, permissions):
return self.fs.create_file(user, name, permissions) def create_process(self, user, name):
return self.ps.create_process(user, name) def main():
os = OperatingSystem()
# 以下都是内部比较繁琐的实现
os.start()
os.create_file('foo', 'hello', '-rw-r-r')
os.create_process('bar', 'ls /tmp') if __name__ == '__main__':
main()

End.