zoukankan      html  css  js  c++  java
  • [python]设计模式

    需要说明:java跟python在思维模式上并不一样,java利用接口以及多态可以实现很多抽象上的东西,而python不行,其实以下很多设计模式写法并不适用也没有必要,更多是为了对比和帮助理解这些设计模式,毕竟设计模式的核心是解耦。

    1.单例模式

    #-*- encoding=utf-8 -*-
    
    class Singleton(object):
        def __new__(cls, *args, **kw):
            if not hasattr(cls, '_instance'):
                cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
            return cls._instance
    
    a = Singleton()
    b = Singleton()
    print id(a)
    print id(b)

    2.模板模式

    #coding:utf-8
    
    class CaffeineBeverageWithHook(object):
        def prepareRecipe(self):
            self.boilWater()
            self.brew()
            self.pourInCup()
            if self.customerWantsCondiments():
                self.addCondiments()
    
        def brew(self):
            print "start brew."
    
        def addCondiments(self):
            pass
    
        def boilWater(self):
            print "start boilWater."
    
        def pourInCup(self):
            print "Pour into cup"
    
        def customerWantsCondiments(self):
            return False
    
    class CoffeeWithHook(CaffeineBeverageWithHook):
        def brew(self):
            print "Dripping coffee through filter."
    
        def addCondiments(self):
            print "Add Sugar and Milk."
    
        def customerWantsCondiments(self):
            return True
    
    if __name__ == '__main__':
        coffeeWithHook = CoffeeWithHook()
        coffeeWithHook.prepareRecipe()

    3.适配器模式

    #coding: utf-8
    
    class Target(object):
        def request(self):
            print "this is target.request method."
    
    class Adaptee(object):
        def special_request(self):
            print "this is Adaptee.special_request method."
    
    class Adapter(object):
        def __init__(self):
            self.special_req = Adaptee()
    
        def request(self):
            self.special_req.special_request()
    
    
    if __name__ == '__main__':
        adapter = Adapter()
        adapter.request()

     4.策略模式:在策略模式中遵循依赖倒置原则,使得策略在代码运行时生效

    # -*- coding: utf-8 -*-
    
    class IStrategy(object):
        def doSomething(self):
            return
    
    class ConcreteStrategy1(IStrategy):
        def doSomething(self):
            print "concreteStrategy 1"
    
    class ConcreteStrategy2(IStrategy):
        def doSomething(self):
            print "concreteStrategy 2"
    
    class Context(object):
        def __init__(self, concreteStrategy):
            self.strategy = concreteStrategy()
    
        def execute(self):
            self.strategy.doSomething()
    
    if __name__ == '__main__':
        print "-----exec concreteStrategy 1-----"
        context = Context(ConcreteStrategy1)
        context.execute()
    
        print "-----exec concreteStrategy 2-----"
        context = Context(ConcreteStrategy2)
        context.execute()

    5.工厂模式

    #coding:utf-8
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    
    class XMobile(object):
        def __init__(self, factory):
            self._factory = factory
        def order_mobile(self, brand):
            mobile = self._factory.create_mobile(brand)
            mobile.special_design()
            mobile.hardware()
            mobile.software()
            mobile.combine()
            mobile.box()
    
    class MobileFactory(object):
        def create_mobile(self, brand):
            if brand == "Huawei":
                mobile = HuaweiProductLine(brand)
            elif brand == "Xiaomi":
                mobile = XiaomiProductLine(brand)
            elif brand == "Meizu":
                mobile = MeizuProductLine(brand)
            return mobile
    
    class MobileProductLine(object):
        def __init__(self, brand):
            self.brand = brand
    
        def hardware(self):
            print "准备硬件"
    
        def software(self):
            print "准备软件"
    
        def combine(self):
            print "合并手机"
    
        def box(self):
            print "封装手机"
    
    class HuaweiProductLine(MobileProductLine):
        def __init__(self, brand):
            super(HuaweiProductLine,self).__init__(brand)
    
        def special_design(self):
            print "使用Haisi CPU"
    
    class XiaomiProductLine(MobileProductLine):
        def __init__(self, brand):
            super(XiaomiProductLine,self).__init__(brand)
    
        def special_design(self):
            print "使用MIUI"
    
    class MeizuProductLine(MobileProductLine):
        def __init__(self, brand):
            super(MeizuProductLine,self).__init__(brand)
    
        def special_design(self):
            print "使用Flyme"
    
    if __name__ == '__main__':
        mobileFactory = MobileFactory()
        xmobile = XMobile(mobileFactory)
        xmobile.order_mobile("Huawei")

    6.观察者模式

    #coding:utf-8
    
    class Subject(object):
        def __init__(self):
            self.obs_list = []    # observer对象
    
        def addObserver(self, obs):
            self.obs_list.append(obs)
    
        def delObserver(self, obs):
            self.obs_list.pop(obs)
    
        def notifyObserver(self):
            for obs in self.obs_list:
                obs.update()
    
        def doSomething(self):
            return
    
    class ConcreteSubject(Subject):
        def __init__(self):
            super(ConcreteSubject, self).__init__()
    
        def doSomething(self):
            self.notifyObserver()
    
    class Observer(object):
        def update(self):
            return
    
    class ConcreteObserver1(Observer):
        def update(self):
            print "观察者1收到信息,并进行处理。"
    
    class ConcreteObserver2(Observer):
        def update(self):
            print "观察者2收到信息,并进行处理。"
    
    if __name__ == '__main__':
        concreteSubject = ConcreteSubject()
        concreteSubject.addObserver(ConcreteObserver1())
        concreteSubject.addObserver(ConcreteObserver2())
        concreteSubject.doSomething()

    7.外观模式

    外观模式是将一系列接口进行封装,使得外层调用更加方便,因此不作说明

    to be continue...

  • 相关阅读:
    鲜牛奶与纯牛奶的区别 All In One
    Rough Notation Animation All In One
    java基础编程String及相关
    JDBC1
    java基础数据类型
    java基础编程
    JDBC3
    MYSQL1
    JDBC2
    JSP和Servlet的相同点和不同点,他们之间的联系
  • 原文地址:https://www.cnblogs.com/alexkn/p/5628612.html
Copyright © 2011-2022 走看看