设计模式—策略模式

今天早上醒来,冬日里济南久违的大晴天。可是没人约出去玩呀~所以沏壶茶写一篇博客平复一下悲愤的心情吧~2333.    说道程序猿这条不归路,真实悲从中来,今早看到一段子,说昨天晚上下班,路上一个漂亮姑娘朝我走来:“请问你是不是学计算机的?”我疑惑地点头,她兴奋地又问:“那你有女朋友吗?”我兴奋地摇头:“没有呀!你家电脑是不是坏了?”她没有回答我,而是转过身对后面的女孩说:“看吧,我就知道这
摘要由CSDN通过智能技术生成

  今天早上醒来,冬日里济南久违的大晴天。可是没人约出去玩呀~所以沏壶茶写一篇博客平复一下悲愤的心情吧~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()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值