前言


参考资源

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

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

  

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

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

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

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

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

教学


一、基本原理

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

二、类图

类关系表示

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

  • Association:

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

  • 菱形尾巴 + Association:

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

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

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

[Generalization]:实现继承;

[Realization]:实现接口;

  • 虚化的 Association:  

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

Aggregation 与 Composition

要点:

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

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

三、外观模式

外观模式 UML

外观模式 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.

[PyData] 02 - Data Preprocessing and Cleaning的更多相关文章

  1. [Pandas] 06 - Data Preprocessing and Cleaning

    From: DBWangGroup 基于该系列代码的实践与补充思考. 补充:特征工程 结合:[Scikit-learn] 4.3. Preprocessing data /* implement */

  2. [Machine Learning with Python] My First Data Preprocessing Pipeline with Titanic Dataset

    The Dataset was acquired from https://www.kaggle.com/c/titanic For data preprocessing, I firstly def ...

  3. 神经网络中的数据预处理方法 Data Preprocessing

    0.Principal component analysis (PCA) Principal component analysis (PCA) is a statistical procedure t ...

  4. [PyData] 03 - Data Representation

    Ref: http://blog.csdn.net/u013534498/article/details/51399035 如何在Python中实现这五类强大的概率分布 考虑下在mgrid上画二维概率 ...

  5. MLP(SGD or Adam) Perceptron Neural Network Working by Pytorch(including data preprocessing)

    通过MLP多层感知机神经网络训练模型,使之能够根据sonar的六十个特征成功预测物体是金属还是石头.由于是简单的linearr线性仿射层,所以网络模型的匹配度并不高. 这是我的第一篇随笔,就拿这个来练 ...

  6. [AI] 深度数据 - Data

    Data Engineering Data  Pipeline Outline [DE] How to learn Big Data[了解大数据] [DE] Pipeline for Data Eng ...

  7. [Code::Blocks] Install wxWidgets & openCV

    The open source, cross platform, free C++ IDE. Code::Blocks is a free C++ IDE built to meet the most ...

  8. 本人SW知识体系导航 - Programming menu

    将感悟心得记于此,重启程序员模式. js, py, c++, java, php 融汇之全栈系列 [Full-stack] 快速上手开发 - React [Full-stack] 状态管理技巧 - R ...

  9. 转:jQuery.data

    原文地址:http://www.it165.net/pro/html/201404/11922.html 内存泄露 首先看看什么是内存泄露,这里直接拿来Aaron中的这部分来说明什么是内存泄露,内存泄 ...

随机推荐

  1. CocosCreator动作系统

    废话没有,直接上代码,有注释可以看的, cc.Class({ extends: cc.Component, properties: { player:{ default:null, type:cc.N ...

  2. 【翻译】TCP backlog在Linux中的工作原理

    原文How TCP backlog works in Linux水平有限,难免有错,欢迎指出!以下为翻译: 当应用程序通过系统调用listen将一个套接字(socket)置为LISTEN状态时,需要为 ...

  3. nginx image_filter 配置记录

    nginx_image_filter http_image_filter_module 配置 ---------------------------------- 第一种: //官方配置 locati ...

  4. EF6 简单增删改查示例代码

    示例一: private DbContext _dbContext; public DbContext CurrentContext { get { if (_dbContext == null) { ...

  5. NSURLSession 相关清单

    浅析 NSURLSession      http://boboshone.com/blog/2013/10/21/nsurlsession-tutorial/ 介绍整体流程结构. iOS NSURL ...

  6. Android批量图片加载经典系列——afinal框架实现图片的异步缓存加载

    一.问题描述 在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存加载(查看系列文章:http://www.cnblogs.com/jerehedu/p/4607599.html# ...

  7. Eclipse复制项目彻底修改项目名称

    一.需求 需要新做一个项目,框架还是Maven+SSM,于是就把原来的项目copy了一个,操作是直接选中原项目,CTRL+C ,然后粘贴,这个时候会让你选择工作空间和给一个新的项目名字,如下图,输入新 ...

  8. Android.mk简介<转>

    文章参照:http://blog.sina.com.cn/s/blog_67d8d7060100q8un.html Android.mk文件是GNU Makefile的一小部分,它用来对Android ...

  9. 【LeetCode】240. Search a 2D Matrix II

    Search a 2D Matrix II Write an efficient algorithm that searches for a value in an m x n matrix. Thi ...

  10. .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)

    本随笔续接:.NET 同步与异步之锁(ReaderWriterLockSlim)(八) 之前的随笔已经说过.加锁虽然能很好的解决竞争条件,但也带来了负面影响:性能方面的负面影响.那有没有更好的解决方案 ...