[Design Patterns] 02. Structural Patterns - Facade Pattern

前言


参考资源

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

只把经常使用的五星的掌握便可。设计模式

   

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

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

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

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

 

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

 

 

 

教学


1、基本原理

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

 

 

2、类图

类关系表示

类关系参见: http://www.javashuo.com/article/p-vxxbqupp-bv.html.net

  • Association:

将一个类的对象做为另外一个类的属性;设计

  • 菱形尾巴 + Association:

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

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

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

[Generalization]:实现继承;

[Realization]:实现接口;

  • 虚化的 Association:  

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

 

Aggregation 与 Composition

要点:

若是是“必要的”,那么就须要在类内“create”了呢。

若是只是“弱弱地使用”,那么“部分“ 能够在外部建立,再以参数形式传入 "总体” 使用。

 

3、外观模式

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


1、虚基类

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.

相关文章
相关标签/搜索