今天早上醒来,冬日里济南久违的大晴天。可是没人约出去玩呀~所以沏壶茶写一篇博客平复一下悲愤的心情吧~2333.
说道程序猿这条不归路,真实悲从中来,今早看到一段子,说昨天晚上下班,路上一个漂亮姑娘朝我走来:“请问你是不是学计算机的?”我疑惑地点头,她兴奋地又问:“那你有女朋友吗?”我兴奋地摇头:“没有呀!你家电脑是不是坏了?”她没有回答我,而是转过身对后面的女孩说:“看吧,我就知道这种背双肩包的是学计算机的屌丝。”ORZ
行了,不扯淡了,今天复习一下设计模式里面的策略模式。
策略模式,先给出度娘的说法:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
这一句话什么意思?我们接着桥梁模式说下去,上一次的桥梁模式。将抽象和实现解耦,使得两者可以独立地变化。其精髓在于,通过组合,能够避免继承机制所带来的诸多不利,在类中实例化别的类,达到独立变化的目的。
还是以鸟群作为一个例子,桥梁模式已经上佳,但是我们是否考虑过。作为bird类来说,我们已经可以通过它的种种行为来判断which kind of bird。有了这一种认识,我们不妨认为,鸟类是一种客户端,它需要什么样的服务,我们可以直接从别的地方去实例类。这样一来,就省去了各式各样的不同类别的鸟去继承bird这个父类。是不是更加简便了?
经过上面的例子,我们在程序设计中,鸟就是一个客户端,我们将它实例化的时候需要什么样的行为,我们就在鸟中赋予什么样的行为。我们称这种行为为策略。关于鸟例子的类图如下:
关于策略模式,比较经典的使用场景是商场。比如说,我去一个电子商场去组装一台电脑。对的,为了省钱,我决定组装一台电脑。这时我需要决定我需要哪一款CPU,哪一种型号的内存,什么样的主板,还有什么样的鼠标键盘等等。不同的人会根据自己的需要配置不同型号和价位的配件。有的人喜欢打游戏,可能内存好一点,有的人喜欢PS,可能显卡要求高。
根据上述的情况,商场在拟定不同的策略,供我们挑选。关于这一类的类图和python实现如下:
#Strategy
class custom:
def __init__(self,cpu,memory,graphics):
self.cpu=cpu
self.memory=memory
self.graphics=graphics
def price(self):
print 'cpu : '+str(self.cpu.name)
print 'memory : '+str(self.memory.name)
print 'graphics : '+str(self.graphics.name)
money=self.cpu.price+self.memory.price+self.graphics.price
print 'takes : '+str(money)
class CPU:
def __init__(self,name,money):
self.name=name
self.price=money
class good_CPU(CPU):
def discount(self,rate):
self.price=self.price*rate
class bad_CPU(CPU):
def discount(self,money):
self.price=self.price-money
class memory:
def __init__(self,name,money):
self.name=name
self.price=money
class good_memory(memory):
def discount(self,rate):
self.price=self.price*rate
class bad_memory(memory):
def discount(self,money):
self.price=self.price-money
class graphics:
def __init__(self,name,money):
self.name=name
self.price=money
class good_graphics(graphics):
def discount(self,rate):
self.price=self.price*rate
class bad_graphics(graphics):
def discount(self,money):
self.price=self.price-money
if __name__=="__main__":
my_cpu=good_CPU('good_cpu',500)
my_memory=good_memory('good_memory',500)
my_graphics=bad_graphics('bad_graphics',500)
my_cpu.discount(0.8)
my_memory.discount(0.9)
my_graphics.discount(100)
leo=custom(my_cpu,my_memory,my_graphics)
leo.price()