【编程思想】【设计模式】【结构模式Structural】门面模式/外观模式Facade

Python版

https://github.com/faif/python-patterns/blob/master/structural/facade.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
*What is this pattern about?
The Facade pattern is a way to provide a simpler unified interface to
a more complex system. It provides an easier way to access functions
of the underlying system by providing a single entry point.
This kind of abstraction is seen in many real life situations. For
example, we can turn on a computer by just pressing a button, but in
fact there are many procedures and operations done when that happens
(e.g., loading programs from disk to memory). In this case, the button
serves as an unified interface to all the underlying procedures to
turn on a computer.

*What does this example do?
The code defines three classes (TC1, TC2, TC3) that represent complex
parts to be tested. Instead of testing each class separately, the
TestRunner class acts as the facade to run all tests with only one
call to the method runAll. By doing that, the client part only needs
to instantiate the class TestRunner and call the runAll method.
As seen in the example, the interface provided by the Facade pattern
is independent from the underlying implementation. Since the client
just calls the runAll method, we can modify the classes TC1, TC2 or
TC3 without impact on the way the client uses the system.

*Where is the pattern used practically?
This pattern can be seen in the Python standard library when we use
the isdir function. Although a user simply uses this function to know
whether a path refers to a directory, the system makes a few
operations and calls other modules (e.g., os.stat) to give the result.

*References:
https://sourcemaking.com/design_patterns/facade
https://fkromer.github.io/python-pattern-references/design/#facade
http://python-3-patterns-idioms-test.readthedocs.io/en/latest/ChangeInterface.html#facade

*TL;DR80
Provides a simpler unified interface to a complex system.
"""

from __future__ import print_function
import time

SLEEP = 0.1

# Complex Parts
class TC1:

    def run(self):
        print(u"###### In Test 1 ######")
        time.sleep(SLEEP)
        print(u"Setting up")
        time.sleep(SLEEP)
        print(u"Running test")
        time.sleep(SLEEP)
        print(u"Tearing down")
        time.sleep(SLEEP)
        print(u"Test Finished\n")

class TC2:

    def run(self):
        print(u"###### In Test 2 ######")
        time.sleep(SLEEP)
        print(u"Setting up")
        time.sleep(SLEEP)
        print(u"Running test")
        time.sleep(SLEEP)
        print(u"Tearing down")
        time.sleep(SLEEP)
        print(u"Test Finished\n")

class TC3:

    def run(self):
        print(u"###### In Test 3 ######")
        time.sleep(SLEEP)
        print(u"Setting up")
        time.sleep(SLEEP)
        print(u"Running test")
        time.sleep(SLEEP)
        print(u"Tearing down")
        time.sleep(SLEEP)
        print(u"Test Finished\n")

# Facade
class TestRunner:

    def __init__(self):
        self.tc1 = TC1()
        self.tc2 = TC2()
        self.tc3 = TC3()
        self.tests = [self.tc1, self.tc2, self.tc3]

    def runAll(self):
        [i.run() for i in self.tests]

# Client
if __name__ == ‘__main__‘:
    testrunner = TestRunner()
    testrunner.runAll()

### OUTPUT ###
# ###### In Test 1 ######
# Setting up
# Running test
# Tearing down
# Test Finished
#
# ###### In Test 2 ######
# Setting up
# Running test
# Tearing down
# Test Finished
#
# ###### In Test 3 ######
# Setting up
# Running test
# Tearing down
# Test Finished
#

Python转载版

原文地址:https://www.cnblogs.com/demonzk/p/9035434.html

时间: 2024-10-05 05:32:20

【编程思想】【设计模式】【结构模式Structural】门面模式/外观模式Facade的相关文章

Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别

本文介绍7种结构型模式里的剩下两种:享元模式.代理模式. 一.享元模式FlyWeight 享元模式比较简单且重要,在很多场合都被用到,只不过封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象.这个概念给的有些抽象,说白了就是如果内存中存在某个对象A,如果再次需要使用对象A的时候如果内存中有A这个对象就直接使用它,不要再次new了.如果没有,则重新new一个.基于这个特点,享元模式使用时一般会给待访问对象传递一个Tag,用来标识这个对象,而且要同时使用抽象工厂的方法进行访

设计模式之代理模式、适配器模式和外观模式

编写基于另一组类的包装器接口是一项常见的API设计任务,例如,你的工作可能是维护一个大型的遗留代码库,相比重构所有代码,你更愿意审计一个新的 ,更简洁的API,以隐藏所有的底层遗留代码:或者你可能已经编写了一个C++API,后来需要给特定客户提供C接口:或者你的API用到了一个第三方依赖库,你想让客户直接使用此库,但是又不想将此库直接暴露给客户. 创建包装器API的潜在副作用是影响性能,这主要因为额外增加的一级间接寻址以及存储包装层次状态带来的开销.但就上面提到的那些情而言,这么做可以创建质量更

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

面向对象的设计模式(十二),外观模式

?终于考试完了,瞬间感觉轻松了许多,又可以安心地写代码了,下面进入今天的正题–外观模式. ?外观模式,也称门面模式,顾名思义,就是一个对象封装了一系列相关的操作(行为),使得这些操作仅对外提供(暴露)方法(接口),客户端根据这些外观(暴露的接口)就可以简单地完成一系列操作,达到了客户端无需知道内部实现细节,只需知道对象的外观就可以实现一系列行为,简单来说就是面向对象的封装.这一系列行为也就是一个系统的功能. 定义:通过一个统一的对象实现一个系统的外部与内部的通讯,提供了一个高层次的接口,使得系统

设计模式(十二): 外观模式

外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用. 介绍 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口. 何时使用: 1.客户

设计模式学习笔记之适配器模式、外观模式

适配器模式     将一个类的接口转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间. 通过创建适配器进行接口转换,让不兼容的接口变成兼容.这可以让客户从实现的接口解耦.如果在一段时间后,想要改变接口,适配器可以将改变的部分封装起来,客户就不必为了应对不同的接口 而每次跟着修改. 客户使用适配器的过程: 1.客户通过目标接口调用适配器的方法对适配器发出请求: 2.适配器使用被适配器接口把请求转换成被适配器的一个或多个调用接口: 3.客户端收到调用的结果,但并未察觉这一切是适配器在

《大话设计模式》ruby版代码:外观模式

需求: 股民买卖股票 初步代码: # -*- encoding: utf-8 -*- #股票1 class Stock1 def buy puts '股票1买入' end def sell puts '股票1卖出' end end #股票2 class Stock2 def buy puts '股票2买入' end def sell puts '股票2卖出' end end #股票3 class Stock3 def buy puts '股票3买入' end def sell puts '股票3

大话设计模式C++实现-第12章-外观模式

一.UML图 二.概念 外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 三.说明 Q:外观模式在什么时候使用呢? A:分为三个阶段: (1)首先,在设计初期阶段,应该要有意识的将不同的两个层分离. (2)第二,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时也会产生很多很小的类,这本是好事儿,但是也给外部调用他们的用户程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少他们之间的依赖

设计模式在游戏中的应用--外观模式(八)

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用.外观模式相当于KFC里面的套餐,大多数人去FKC吃中饭,本质其实就是为了填饱肚子,消费者需要主食.饮料和小吃,有了各种套餐之后,消费者去KFC可以选择各种套餐就能满足自己的需要,不至于由于自己不会点餐都点主食而造成口渴和难以下咽的情况.套餐可以满足大多数人的需求. MMORPG游戏中也有着一些外观模式的应用,例如游戏中一种套餐可以让玩家升级到满级,学习和装备了最高的技能和装备.

结构型模式(五)外观模式

一句话的概要 外观模式提供了一个统一接口,并且包装了各个子接口.用户只要调用外观类的接口就可以,剩下的操作由外观类进行. 剧情 女神跟小明同学,出去逛街.女神对小明说,我要吃肯德基.你马上给我去买回来. 但是小明同学,人生地不熟,得先找附近哪里有,然后去买,最后回来给女神吃. 那么我们把小明同学的这一系列操作.可以都规划到女神说,我要吃肯德基,这一个方法里头. 我们用外观模式来构造以上的剧情 任务一:构造查询肯德基和买肯德基这两个子方法 public class LookKFC { public