您的位置:首页 > 编程语言 > Python开发

[python]设计模式

2016-06-29 23:44 204 查看
需要说明: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...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: