All articles

  1. python设计模式之抽象工厂模式

    抽象工厂模式

    和简单工厂/工厂方法不同,抽象工厂可能最好理解,举个例子:
    比如2个动物,猫和狗,他们都有speak和eat的function,但是很明显他们执行的结果是不同的 有个’工厂’(抽象工厂里面一个类型就是一个工厂,这点和其他模式的不同)专门帮助我们找到对应的动物做正确的操作 有个类/函数可以通过参数帮助我们找到上面的这个工厂  这就是抽象工厂

    python的例子

    from abc import ABCMeta
    
    class StandardFactory(object):
        '''这就是那个抽象工厂'''
        @staticmethod
        def get_factory(factory):
            '''根据参数找到对实际操作的工厂'''
            if factory == 'cat':
                return CatFactory()
            elif factory == 'dog':
                return DogFactory()
            raise TypeError('Unknown Factory.')
    

    这里帮助dog这个产品类找到应该的属性的工厂

    class DogFactory(object):
        def ...
  2. python设计模式之Adapter模式

    适应模式

    Adapter模式是一个很实用的模式,比如在zope中。 以前说了抽象工厂模式,你会发现每个产品类的接口方法名都是一样的,比如eat,他们都要吃。这个Adapter模式的区别呢? 各个产品类的操作不尽相同,但是怎么样兼容这些不一样的方法呢?举个能想到的例子,我们渐进的来理解

    想要通过不同的动物返回他们的声音和类型

    我想很多人会这么写

    class Dog(object):
        def __init__(self, name)
            self.name = name
        def bark(self):
            return "wangwang"
    
    def Animal(animal):
        return animal.name, animal.bark()
    

    但要是有很类型的动物,其它动物可不会bark(吠), 所以上面的bark这个方法名字就很不好,因为不够通用 ,好吧 我们换个名字make_noise, 这个时候Cat类出现,Adapter模式也第一次出现,为了兼容Dog

    class ...
  3. python设计模式之Borg模式

    Borg模式

    activestate上面有篇文章Singleton? We don’t need no stinkin’ singleton: the Borg design pattern, 告诉我们Borg模式要比单例模式要好。 为什么这样说:单例模式生成的单例一旦生成就一直存在,但是Borg确实和源共享的能修改

    python的例子

    class Config(object):
        _we_are_one = {}
        _myvalue = ""
    
        def __new__(cls, *p, **k):
            self = object.__new__(cls, *p, **k)
            self.__dict__ = cls._we_are_one
            return self
    
        def myvalue(self, value=None):
            if value:
            self ...
  4. python设计模式之桥接模式

    桥接模式

    这个模式其实就是把产品类的实现和抽象类分离,能够灵活的变化,假如你记得状态模式,它是修改内部属性, 而桥接模式是指定好内部属性,每个产品类指定这个属性被桥接模式类调用,适用于产品类可能经常调整变化,这样还能减少了产品类之间的耦合

    python的例子

    这里实现一个打印操作系统名字的功能

    class Bridge(object):
    
        def __init__(self):
            self.__implementation = None
    
        def someFunctionality(self):
            raise NotImplemented()
    
    class UseCase1(Bridge):
        # 根据初始化参数传入实现的产品类
        def __init__(self, implementation):
            self.__implementation = implementation
        # 根据传入的产品类的属性打印结果
        def someFunctionality(self):
            print "UseCase1: ",
            self.__implementation.anotherFunctionality()
    
    
    class UseCase2(Bridge):
        def ...
  5. python设计模式之Builder模式

    Builder模式

    Builder模式帮你把一个不同类的大工程分开成不同的部分,最后在把这些合并起来

    python的例子

    制造一辆车的工序是很繁琐和浩大的,我们可以定一个车辆的描述

    class Vehicle(object):
    
        def __init__(self, type_name):
            self.type = type_name
            self.wheels = None
            self.doors = None
            self.seats = None
    
        # 不同的车子类型,齿轮,车门数,座位数都不尽相同
        def view(self):
            print(
                "This vehicle is a " +
                self.type +
                " with; " +
                str(self.wheels) +
                " wheels, " +
                str(self.doors) +
                " doors, and " +
                str ...
  6. python设计模式之责任链模式

    责任链模式

    比如我们还在读书的时候,考试的分数都是几个档次,比如90-100分,80-90分,好吧我想做一个根据分数打印你的学习成绩的反馈, 比如90-100就是A+,80-90就是A,70-80就是B+… 当然你可以用很多种方法实现,我这里就来实现一个Chain模式:用一系列的类来响应, 但只有遇到适合处理它的类才会处理,类似与case和switch的作用

    python的例子

    class BaseHandler:
        # 它起到了链的作用
        def successor(self, successor):
            self.successor = successor
    
    class ScoreHandler1(BaseHandler):
        def handle(self, request):
            if request > 90 and request <= 100:
                return "A+"
            else:
                # 否则传给下一个链,下同,但是我是要return回结果的
                return self.successor.handle ...
  7. python设计模式之命令调度模式

    命令调度模式

    设想一个问题,假如你经常搞web框架,你知道GET/POST/PUT/DELETE,当你想确定使用那种方式工作你需要大概这样:

    if command == 'get':
        get()
    elif command == 'put':
        put()
    else:
        error()
    

    抑或写一个字典作为调度的方式:

    dispatch_table = {
        'get': get,
        'put': put,
    }
    
    if dispatch_table.has_key(command):
        func = dispatch_table[command]
        func()
    else:
        error()
    

    其实呢?python已经自带了很多这样的功能的东西,Guido van Rossum把这个模式叫做Command Dispatch

    喏 这就是,只是你没有意识到

    def greet(who):
        print "Hello %s ...
  8. python设计模式之组合模式

    组合模式

    我们把Composite模式看成一个复杂的属性结构,其实基本有三种角色:树干(定义一些操作树叶leaf的操作),树枝(树干上有很多树枝)和树叶(树干想要具体操作的对象) ,Composite模式帮我们实现:即它们在充当对象的时候,还是其他对象的容易,从而提供一致性

    python的例子

    class Trunk(object):
        '''树干'''
        def __str__(self):
            pass
    
        def subtree(self):
            pass
    
    class Composite(Trunk):
        def __init__(self, left=None, right=None, length=None):
            self.left=left
            self.right=right
            self.length=length
    
        def __str__(self ...

Page 1 / 3 »

博客链接