zoukankan      html  css  js  c++  java
  • python学习笔记之---设计模式

    ①工厂模式:只产生对象,不调用方法
    工厂方法: 根据传入参数的不同, 而返回对应的不同对象
    class TomatoesAndEgg:
        def __init__(self):
            self.data = "男士喜欢吃番茄炒蛋"
        def getData(self):
            return self.data
    class SugarAndCucumber:
        def __init__(self):
            self.data = "女士喜欢吃糖拌黄瓜"
        def getData(self):
            return self.data
    # 工厂方法: 根据传入参数的不同, 而返回对应的对象
    def cook_factory(sex):
        if sex == "man":
            food = TomatoesAndEgg
        elif sex == "woman":
            food = SugarAndCucumber
        else:
            raise ValueError("请出入正确的性别: {}".format(sex))
        return food()
    if __name__ == "__main__":
        man = cook_factory("man")
        woman = cook_factory("woman")
        data_man = man.getData()  # 返回String类型数据
        data_woman = woman.getData()  # 返回int类型数据
        # getData()返回不同类型的数据, 这在实际开发中是很常见的
        print(data_man)      # => 男士喜欢吃番茄炒蛋
        print(data_woman)    # => 女士喜欢吃糖拌黄瓜
    C:UsersdellDesktop练习6>py -3 0613.py
    男士喜欢吃番茄炒蛋
    女士喜欢吃糖拌黄瓜
     
    工厂模式与多态的区别?
    def cook_factory(food):
        return food()  #工厂函数,只返回实例,不做调用
        food().getData()#调用了实例的方法,多态
     
     
     
    ②抽象工厂模式
    本质:调用工厂类的不同实例方法,产生不同实例的方式,叫做抽象工厂模式
    class TomatoesAndEgg:
        def __init__(self):
            self.data = "番茄炒蛋"
        def getData(self):
            return self.data
    class SugarAndCucumber:
        def __init__(self):
            self.data = "糖拌黄瓜"
        def getData(self):
            return self.data
    # 厨子
    # 抽象工厂(可以有多个), 有一组工厂方法, 每个工厂方法生产对应的对象
    class CookFactory:
        # 生产'番茄炒蛋'的工厂方法
        def cook_te(self):
            return TomatoesAndEgg()
        # 生产'白糖拌黄瓜'的工厂方法
        def cook_sc(self):
            return SugarAndCucumber()
    if __name__ == "__main__":
        cook = CookFactory()
        man = cook.cook_te()
        woman = cook.cook_sc()
        data_man = man.getData()
        data_woman = woman.getData()
        print(data_man)  # => 番茄炒蛋
    print(data_woman)  # => 白糖拌黄瓜
    C:UsersdellDesktop练习6>py -3 0613.py
    番茄炒蛋
    糖拌黄瓜
     
     
     
    ③构建者模式
    本质:用一个类,批量调用另外一个实例的所有方法,每一个动作和批量调用是分开定义的。
    from abc import ABCMeta, abstractmethod
     
    class Builder():
        __metaclass__ = ABCMeta
     
        @abstractmethod
        def draw_left_arm(self):
            pass
     
        @abstractmethod
        def draw_right_arm(self):
            pass
     
        @abstractmethod
        def draw_left_foot(self):
            pass
     
        @abstractmethod
        def draw_right_foot(self):
            pass
     
        @abstractmethod
        def draw_head(self):
            pass
     
        @abstractmethod
        def draw_body(self):
            pass
     
     
    class Thin(Builder):
        def draw_left_arm(self):
            print('画左手')
     
        def draw_right_arm(self):
            print('画右手')
     
        def draw_left_foot(self):
            print('画左脚')
     
        def draw_right_foot(self):
            print('画右脚')
     
        def draw_head(self):
            print('画头')
     
        def draw_body(self):
            print('画瘦身体')
     
     
    class Fat(Builder):
        def draw_left_arm(self):
            print('画左手')
     
        def draw_right_arm(self):
            print('画右手')
     
        def draw_left_foot(self):
            print('画左脚')
     
        def draw_right_foot(self):
            print('画右脚')
     
        def draw_head(self):
            print('画头')
     
        def draw_body(self):
            print('画胖身体')
     
     
    class Director():
        def __init__(self, person):
            self.person=person
     
        def draw(self):
            self.person.draw_left_arm()
            self.person.draw_right_arm()
            self.person.draw_left_foot()
            self.person.draw_right_foot()
            self.person.draw_head()
            self.person.draw_body()
     
     
    if __name__=='__main__':
        thin=Thin()
        fat=Fat()
        director_thin=Director(thin)
        director_thin.draw()
        print("-"*30)
        director_fat=Director(fat)
        director_fat.draw()
    C:UsersdellDesktop练习6>py -3 0613.py
    画左手
    画右手
    画左脚
    画右脚
    画头
    画瘦身体
    ------------------------------
    画左手
    画右手
    画左脚
    画右脚
    画头
    画胖身体

    ④设计模式

    代理模式:把真正的对象隔开,代理可以在中间做一些其他的事情,
    代理的好处:把真正实现的类隔开了,自己可以在中间干一些事
    示例:
    #encoding=utf-8
    
    from abc import ABCMeta, abstractmethod
    
    
    class FemaleA():
        def __init__(self, name):
            self.name = name
    
    
    class Male():
        __metaclass__ = ABCMeta
    
        @abstractmethod
        def send_flower(self):
            pass
    
        @abstractmethod
        def send_chocolate(self):
            pass
    
        @abstractmethod
        def send_book(self):
            pass
    
    
    class MaleA(Male):
        def __init__(self, name, love_female):
            self.name = name
            self.love_female = FemaleA(love_female)
    
        def send_flower(self):
            print ('%s送花给%s' % (self.name, self.love_female.name))
    
        def send_chocolate(self):
            print ('%s送巧克力给%s' % (self.name, self.love_female.name))
    
        def send_book(self):
            print ('%s送书给%s' % (self.name, self.love_female.name))
    
    
    class Proxy(Male):
        def __init__(self, name, proxyed_name, love_female):
            self.name = name
            self.proxyed = MaleA(proxyed_name, love_female)
    
        def send_flower(self):
            self.proxyed.send_flower()
    
        def send_chocolate(self):
            self.proxyed.send_chocolate()
    
        def send_book(self):
            self.proxyed.send_book()
    
    
    if __name__ == '__main__':
        p = Proxy('男B', '男A', '女A')
        p.send_book()
        p.send_chocolate()
        p.send_flower()

    ⑤状态代理

    示例:

    #encoding=utf-8
    
    from abc import ABCMeta, abstractmethod
    
    class State():
        __metaclass__ = ABCMeta
    
    
        @abstractmethod
        def write_code(self):
            pass
    
    
    
    class Morning(State):
        def write_code(self, work):
            if work.hour <= 12 and work.hour > 8:
                print('上午工作,精神百倍')
            else:
                print("Morning write_code is invoked!")
                work.set_status(Noon())
                work.write_code(work)
    
    
    
    class Noon(State):
        def write_code(self, work):
            if work.hour <= 14 and work.hour>12 :
                print('中午工作,困,想午休')
            else:
                print("noon write_code is invoked!")
                work.set_status(Afternoon())
                work.write_code(work)
    
    
    
    
    class Afternoon(State):
        def write_code(self, work):
            if work.hour <= 18 and work.hour>14:
                print('下午工作,状态不错')
            else:
                print("Afternoon write_code is invoked!")
                work.set_status(Eve())
                work.write_code(work)
    
    
    
    
    class Eve(State):
        def write_code(self, work):
            if work.hour <= 22 and work.hour>18:
                print('加班了,状态不太好')
            else:
                print("Eve write_code is invoked!")
                work.set_status(Night())
                work.write_code(work)
    
    
    
    
    class Night(State):
        def write_code(self, work):
            if work.hour <= 8 or work.hour > 22:
                print('不行了,要睡觉了')
            else:
                print("Night write_code is invoked!")
                work.set_status(Morning())
                work.write_code(work)
    
    
    
    
    class Work():
        def __init__(self, hour):
            self.hour = hour
            self.state = Morning()
    
    
        def set_status(self, state):
            self.state = state
    
    
        def write_code(self, work):
            self.state.write_code(work)
    
    
    
    
    if __name__ == '__main__':
        work = Work(10)
        for hour in (14,20):
            work.hour = hour
            print('%d点,' % hour)
            work.write_code(work)

    ⑥模板模式

    示例:

    #encoding=utf-8
    
    #把打印的公共方法抽象到一个基类中,要用到的数据方法另外一个子类中
    class Student():
        def answer1(self):
            print('题目一:XXXXXX')
            print('我的答案是:%s' %self.get_answer1())
        def get_answer1(self):
            pass
        def answer2(self):
            print('题目二:XXXXXX')
            print('我的答案是:%s' %self.get_answer2())
        def get_answer2(self):
            pass
    
    class StudentA(Student):
        def get_answer1(self):
            return 'B'
        def get_answer2(self):
            return 'B'
    
    class StudentB(Student):
        def answer1(self):
            return 'C'
        def answer2(self):
            return 'D'
    
    if __name__=='__main__':
        student_a=StudentA()
        student_a.answer1()
        student_a.answer2()
        student_b=StudentB()
        student_b.answer1()
        student_b.answer2()

    ⑦命令模式

    示例:

    class Switch:
        ''' The INVOKER class:传令官'''
    
        def __init__(self, flipUpCmd, flipDownCmd):
            self.__flipUpCommand = flipUpCmd
            self.__flipDownCommand = flipDownCmd
    
        def flipUp(self):#传开灯的命令
            self.__flipUpCommand.execute()
    
        def flipDown(self):#传关灯的命令
            self.__flipDownCommand.execute()
    
    class Light:
        '''The RECEIVER Class:执行者'''
        def turnOn(self):
            print("The light is on")
    
        def turnOff(self):
            print("The light is off")
    
    class Command:
        """The Command Abstrace class"""
        def __init__(self):
            pass
        def execute(self):
            pass
    
    class FlipUpCommand(Command):#开灯传令的对象
        '''The Command class for turning on the light'''
    
        def __init__(self, light):
            self.__light = light
    
        def execute(self):
            self.__light.turnOn()
    
    class FileDownCommand(Command):#关灯传令的对象
        '''The Command class for turning off the light'''
    
        def __init__(self, light):
            Command.__init__(self)
            self.__light = light
    
        def execute(self):
            self.__light.turnOff()
    
    class LightSwitch:
        '''The Client Class:发起者'''
        def __init__(self):
            self.__lamp = Light()
            self.__switchUp = FlipUpCommand(self.__lamp)
            self.__switchDown = FileDownCommand(self.__lamp)
            self.__switch = Switch(self.__switchUp, self.__switchDown)
    
        def switch(self, cmd):
            cmd = cmd.strip().upper()
            try:
                if cmd == "ON":
                    self.__switch.flipUp()
                elif cmd == "OFF":
                    self.__switch.flipDown()
                else:
                    print("Argument "ON" or "OFF" is required")
            except Exception as msg:
                print("Exception occured:%s" % msg)
    
    
    #Execute if the file is run as a script and not imported as a module
    
    if __name__ == "__main__":
        lightSwitch = LightSwitch()
    
        print("Switch ON test")
        lightSwitch.switch("ON")
    
        print("Switch OFF test")
        lightSwitch.switch("OFF")
    
        print("Invalid Command test")
        lightSwitch.switch("****")

    ⑧外观模式

    本质:批量调用其他的类的逻辑被封装到了外观类的方法里。
    示例:
    #encoding=utf-8
    
    class A():
        def run(self):
            print('A run')
        def jump(self):
            print('A jump')
    
    class B():
        def run(self):
            print('B run')
        def jump(self):
            print('B jump')
    
    class C():
        def run(self):
            print('C run')
        def jump(self):
            print('C jump')
    
    class Facade():
        def __init__(self):
            self.a=A()
            self.b=B()
            self.c=C()
        def run(self): #批量操作
            for item in ('a','b','c'):
                getattr(self,item).run()
        def jump(self):
            for item in ('a','b','c'):
                getattr(self,item).jump()
    
    if __name__=='__main__':
        facade=Facade()
        facade.run()
        facade.jump()

    ⑨组合模式

    示例:

    def count_to(count):
        """Counts by word numbers, up to a maximum of five"""
        numbers= ["one","two", "three", "four","five"]
        #>>> list(zip(range(2), numbers))  
    #[(0, 'one'), (1, 'two')]
    #range中的数量可以限制产生几个number中的元素
        for pos, number in zip(range(count), numbers):
            yield number
    # Test the generator
    count_to_two = lambda: count_to(2)
    count_to_five = lambda: count_to(5)
    print('Counting to two...')
    for number in count_to_two():
        print (number)
    print(" ")
    print('Counting to five...')
    for number in count_to_five():
        print (number)

    ⑩策略模式

    示例:

    import types
    #核心思想:将外部的函数,转化为类中的方法。
    #改变类中的实现算法。
    class StrategyExample:
        def __init__(self, func=None):
            self.name= 'Strategy Example 0'        
            if func is not None:
                #types.MethodType:将一个函数绑定到一个对象中
                self.execute= types.MethodType(func,self)     
        def execute(self):        
            print(self.name)  
    def execute_replacement1(self):
        print(self.name+ ' from execute 1')  
    def execute_replacement2(self):
        print(self.name+ ' from execute 2')
    if __name__ =='__main__':
        strat0= StrategyExample()    
        strat1= StrategyExample(execute_replacement1)
        strat1.name= 'Strategy Example 1'    
        strat2= StrategyExample(execute_replacement2)
        strat2.name= 'Strategy Example 2'
        strat0.execute()
        strat1.execute()    
        strat2.execute()
  • 相关阅读:
    借用构造函数实现继承
    原型链
    创建对象 之 组合使用构造函数模式和原型模式
    6.原型对象的问题
    Spring MVC
    AOP
    谈谈对Spring IOC的理解
    Mybatis3.x与Spring4.x整合(转)
    手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)
    Appweb写法
  • 原文地址:https://www.cnblogs.com/wenm1128/p/11750907.html
Copyright © 2011-2022 走看看