当前位置: 首页 > 面试题库 >

如何用不同于Wikipedia中示例的方式在Python中编写策略模式?

尉迟清野
2023-03-14
问题内容

在2009年Wikipedia中的Strategy
Pattern条目中,有一个用PHP编写的示例。

大多数其他代码示例执行以下操作:

a = Context.new(StrategyA.new)
a.execute #=> Doing the task the normal way

b = Context.new(StrategyB.new)
b.execute #=> Doing the task alternatively

c = Context.new(StrategyC.new)
c.execute #=> Doing the task even more alternative

在Python代码中,“提交”按钮使用了另一种技术。我不知道Python代码是否也会像其他代码示例那样执行。

更新: 在Python中使用一流的函数可以缩短时间吗?


问题答案:

Python中的示例与其他示例并无太大不同。模拟PHP脚本

class StrategyExample:
    def __init__(self, func=None):
        if func:
             self.execute = func

    def execute(self):
        print("Original execution")

def executeReplacement1():
    print("Strategy 1")

def executeReplacement2():
    print("Strategy 2")

if __name__ == "__main__":
    strat0 = StrategyExample()
    strat1 = StrategyExample(executeReplacement1)
    strat2 = StrategyExample(executeReplacement2)

    strat0.execute()
    strat1.execute()
    strat2.execute()

输出:

Original execution
Strategy 1
Strategy 2

主要区别在于:

  • 您无需编写任何其他类或实现任何接口。
  • 相反,您可以传递将绑定到所需方法的函数引用。
  • 这些函数仍然可以单独使用,并且如果您愿意,原始对象可以具有默认行为(该if func == None模式可以用于该行为)。
  • 确实,它和Python一样干净简洁,优雅。但是你会丢失信息;由于没有显式接口,因此假定程序员是成年人,知道他们在做什么。

请注意,有3种方法可以在Python中动态添加方法:

  • 我给你看的方式 但是该方法将是静态的,不会传递“ self”参数。

  • 使用类名:

StrategyExample.execute = func

在这里,所有实例都将func作为execute方法,并self作为参数传递。

  • 仅绑定到实例(使用types模块):

strat0.execute = types.MethodType(executeReplacement1, strat0)

或使用Python 2,还需要更改实例的类:

strat0.execute = types.MethodType(executeReplacement1, strat0, StrategyExample)

与第一个示例一样,这会将新方法绑定到strat0和only strat0。但是start0.execute()self以争论的形式通过。

如果需要在函数中使用对当前实例的引用,则可以合并第一个和最后一个方法。如果你不:

class StrategyExample:
    def __init__(self, func=None):
        self.name = "Strategy Example 0"
        if func:
             self.execute = func

    def execute(self):
        print(self.name)

def executeReplacement1():
    print(self.name + " from execute 1")

def executeReplacement2():
    print(self.name + " from execute 2")

if __name__ == "__main__":
    strat0 = StrategyExample()
    strat1 = StrategyExample(executeReplacement1)
    strat1.name = "Strategy Example 1"
    strat2 = StrategyExample(executeReplacement2)
    strat2.name = "Strategy Example 2"

    strat0.execute()
    strat1.execute()
    strat2.execute()

你会得到:

Traceback (most recent call last):
  File "test.py", line 28, in <module>
    strat1.execute()
  File "test.py", line 13, in executeReplacement1
    print self.name + " from execute 1"
NameError: global name 'self' is not defined

因此正确的代码将是:

import sys
import types

if sys.version_info[0] > 2:  # Python 3+
    create_bound_method = types.MethodType
else:
    def create_bound_method(func, obj):
        return types.MethodType(func, obj, obj.__class__)

class StrategyExample:
    def __init__(self, func=None):
        self.name = "Strategy Example 0"
        if func:
             self.execute = create_bound_method(func, self)

    def execute(self):
        print(self.name)

def executeReplacement1(self):
    print(self.name + " from execute 1")

def executeReplacement2(self):
    print(self.name + " from execute 2")

if __name__ == "__main__":
    strat0 = StrategyExample()
    strat1 = StrategyExample(executeReplacement1)
    strat1.name = "Strategy Example 1"
    strat2 = StrategyExample(executeReplacement2)
    strat2.name = "Strategy Example 2"

    strat0.execute()
    strat1.execute()
    strat2.execute()

这将输出预期的结果:

Strategy Example 0
Strategy Example 1 from execute 1
Strategy Example 2 from execute 2

当然,在这些功能不能再单独使用的情况下,但是仍然可以绑定到任何对象的任何其他实例,而没有任何接口限制。



 类似资料:
  • 本文向大家介绍PHP实现的策略模式示例,包括了PHP实现的策略模式示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现的策略模式。分享给大家供大家参考,具体如下: 个人觉得设计模式只有在实际应用中才能够慢慢的去熟悉,到最后做到心中有模式,事事有模式,哈哈 例如:一个电商首页,可以根据登陆用户的性别不同显示不同的内容,比如广告和商品类别。 传统方法:在程序内部使用多个if,else

  • 本文向大家介绍实例解析Ruby设计模式编程中Strategy策略模式的使用,包括了实例解析Ruby设计模式编程中Strategy策略模式的使用的使用技巧和注意事项,需要的朋友参考一下 今天你的leader兴致冲冲地找到你,希望你可以帮他一个小忙,他现在急着要去开会。要帮什么忙呢?你很好奇。 他对你说,当前你们项目的数据库中有一张用户信息表,里面存放了很用户的数据,现在需要完成一个选择性查询用户信息

  • 本文向大家介绍PHP策略模式定义与用法示例,包括了PHP策略模式定义与用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP策略模式定义与用法。分享给大家供大家参考,具体如下: 概述 策略模式属于对象的行为模式。其用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化 UML图 策略模式中主要角色

  • 本文向大家介绍详解Python设计模式编程中观察者模式与策略模式的运用,包括了详解Python设计模式编程中观察者模式与策略模式的运用的使用技巧和注意事项,需要的朋友参考一下 观察者模式 观察者模式:又叫发布订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时,会通知所有观察者对象,是他们能自动更新自己。 代码结构 众多MQ中间件都是采用这种模

  • 本文向大家介绍PHP实现的策略模式简单示例,包括了PHP实现的策略模式简单示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现的策略模式。分享给大家供大家参考,具体如下: 比如说购物车系统,在给商品计算总价的时候,普通会员肯定是商品单价乘以数量,但是对中级会员提供8者折扣,对高级会员提供7折折扣,这种场景就可以使用策略模式实现: 更多关于PHP相关内容感兴趣的读者可查看本站专题:

  • 本文向大家介绍Python程序中的观察者模式结构编写示例,包括了Python程序中的观察者模式结构编写示例的使用技巧和注意事项,需要的朋友参考一下 察者模式定义 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖都会收到通知并自动更新。观察者模式提供了一种对象设计,让主题和观察者之间松耦合。 设计原则 为了交互对象之间的松耦合设计而努力。松耦合的设计之所以能让我们建立有弹性的