最常用的12种设计模式小结

您好,以下是我对“最常用的12种设计模式小结”的完整攻略:

最常用的12种设计模式小结

1. 单例模式(Singleton)

单例模式保证在整个应用程序中只有一个实例被创建。这种模式适用于全局对象的创建方式,并且通常使用延迟加载方式进行初始化。

示例:在游戏开发中,通常只需要一个游戏管理器,这个游戏管理器可以使用单例模式实现,确保只有一个游戏管理器对象,并且可以在整个游戏应用程序中提供全局访问。

class GameManager:
    instance = None

    def __new__(cls):
        if not cls.instance:
            cls.instance = super().__new__(cls)
        return cls.instance

game_manager = GameManager()

2. 工厂模式(Factory)

工厂模式实际上是一种创建型模式,它提供了一种创建对象的最佳方式,而不用让客户端程序直接创建这些对象。客户端程序只需要传递正确的参数,就可以获得所需的对象。

示例:在一个游戏开发中,我们需要创建不同种类的敌人。使用工厂模式可以创建不同种类的敌人,而不需要在客户端代码中编写各种敌人类型的对象创建逻辑。

class Enemy:
    def __init__(self, name):
        self.name = name

class SimpleEnemy(Enemy):
    def __init__(self):
        super().__init__("Simple Enemy")

class StrongEnemy(Enemy):
    def __init__(self):
        super().__init__("Strong Enemy")

class EnemyFactory:
    @staticmethod
    def create_enemy(enemy_type):
        if enemy_type == "simple":
            return SimpleEnemy()
        elif enemy_type == "strong":
            return StrongEnemy()

3. 代理模式(Proxy)

代理模式是一种结构型模式,它允许我们使用一个代理对象来代替一个真实对象。代理对象可以控制对真实对象的访问,并且可以在访问真实对象之前和之后执行一些操作。

示例:在一个游戏服务器中,我们可能需要控制某些玩家的行为,比如停止他们的行动。使用代理模式,我们可以在真正的玩家对象之前放置一个代理对象来拦截并控制他们的行为。

class Player:
    def __init__(self, name):
        self.name = name

    def action(self):
        print(f"{self.name} is running...")

class PlayerProxy(Player):
    def __init__(self, player):
        self.player = player

    def action(self):
        if self.player.name == "Joker":
            print(f"{self.player.name} is not allowed to run.")
        else:
            self.player.action()

player = Player("Alice")
player_proxy = PlayerProxy(player)
player_proxy.action()

player = Player("Joker")
player_proxy = PlayerProxy(player)
player_proxy.action()

4. 观察者模式(Observer)

观察者模式是一种行为型模式,它允许一个对象通知其它对象,当它自身发生改变时。这种模式通常用于事件处理系统。

示例:在一个游戏开发中,我们可能需要在玩家杀死敌人时触发一些事件。使用观察者模式,我们可以让一些事件处理器对象订阅这个事件,并且自动触发它们自己的操作。

class Player:
    def __init__(self, name):
        self.name = name
        self.listeners = []

    def add_listener(self, listener):
        self.listeners.append(listener)

    def remove_listener(self, listener):
        self.listeners.remove(listener)

    def kill_enemy(self):
        print(f"{self.name} killed an enemy.")
        for listener in self.listeners:
            listener.handle_event(self)

class GameEvent:
    def handle_event(self, player):
        pass

class LootEvent(GameEvent):
    def handle_event(self, player):
        print(f"{player.name} got a loot.")

class ScoreEvent(GameEvent):
    def handle_event(self, player):
        print(f"{player.name} got a score.")

player1 = Player("Alice")
loot_listener = LootEvent()
score_listener = ScoreEvent()

player1.add_listener(loot_listener)
player1.add_listener(score_listener)

player1.kill_enemy()

5. 装饰器模式(Decorator)

装饰器模式是一种结构型模式,它允许我们通过在运行时向现有对象添加额外的行为,而不需要修改这个对象的代码。

示例:在一个游戏开发中,我们可能需要给武器添加一些额外的属性,比如攻击力、耐久度等等。使用装饰器模式,我们可以实现代码的可扩展性,并且不需要修改现有的武器对象。

class Weapon:
    def get_damage(self):
        pass

class Sword(Weapon):
    def get_damage(self):
        return 100

class WeaponDecorator(Weapon):
    def __init__(self, weapon):
        self.weapon = weapon

    def get_damage(self):
        return self.weapon.get_damage()

class WeaponAttackDecorator(WeaponDecorator):
    def get_damage(self):
        return super().get_damage() + 20

class WeaponDurabilityDecorator(WeaponDecorator):
    def __init__(self, weapon, durability):
        super().__init__(weapon)
        self.durability = durability

    def get_damage(self):
        durability_coef = self.durability / 100
        return super().get_damage() * durability_coef

sword = Sword()
sword_with_attack = WeaponAttackDecorator(sword)
sword_with_durability = WeaponDurabilityDecorator(sword_with_attack, 50)
print(sword.get_damage()) # 100
print(sword_with_attack.get_damage()) # 120
print(sword_with_durability.get_damage()) # 60

6. 策略模式(Strategy)

策略模式是一种行为型模式,它定义了一系列算法,并且使它们之间可以相互替换。使用这种模式,可以让算法的变化独立于使用它们的客户端程序。

示例:在一个游戏开发中,我们需要计算不同种类的攻击方式的伤害值。使用策略模式,我们可以让攻击方式之间相互独立,可以被单独修改和测试。

class AttackStrategy:
    def calculate_damage(self):
        pass

class SlashAttack(AttackStrategy):
    def calculate_damage(self):
        return 50

class StabAttack(AttackStrategy):
    def calculate_damage(self):
        return 30

class Player:
    def __init__(self, attack_strategy):
        self.attack_strategy = attack_strategy

    def attack(self):
        damage = self.attack_strategy.calculate_damage()
        print(f"You caused {damage} damage.")

player1 = Player(SlashAttack())
player1.attack()

player2 = Player(StabAttack())
player2.attack()

7. 适配器模式(Adapter)

适配器模式是一种结构型模式,它可以将一个类的接口转换为另一个类的接口,从而让原本不兼容的类能够一起工作。

示例:在一个游戏开发中,我们可能需要让不同的音效引擎共同工作。使用适配器模式,我们可以将这些不同的音效引擎的调用接口转换成统一的接口,从而让它们能够互相衔接。

class AudioEngine:
    def play_audio(self, ID):
        pass

class UnityAudioEngine(AudioEngine):
    def play_audio(self, audio_ID):
        print(f"Unity audio engine plays audio clip {audio_ID}.")

class UnrealAudioEngine:
    def play_sound(self, sound_ID):
        print(f"Unreal audio engine plays sound {sound_ID}.")

class AudioEngineAdapter(AudioEngine):
    def __init__(self, adapter):
        self.adapter = adapter

    def play_audio(self, audio_ID):
        self.adapter.play_sound(audio_ID)

unity_audio_engine = UnityAudioEngine()
unreal_audio_engine = UnrealAudioEngine()

adapter_for_unreal = AudioEngineAdapter(unreal_audio_engine)
adapter_for_unreal.play_audio("background_music")

unity_audio_engine.play_audio("jump_sound")

adapter_for_unity = AudioEngineAdapter(unity_audio_engine)
adapter_for_unity.play_audio("shoot_sound")

8. 桥接模式(Bridge)

桥接模式是一种结构型模式,它将一个类的抽象部分和实现部分分离开来,以便它们可以独立变化。使用桥接模式,可以在不破坏现有结构的情况下,更改一个类的实现方式。

示例:在一个游戏开发中,我们可能需要提供不同操作系统平台的支持。使用桥接模式,我们可以隔离不同平台之间的差异,从而让游戏引擎可以在任意平台上运行。

class Renderer:
    def render(self, shape):
        pass

class Shape:
    def render(self, renderer):
        pass

class Square(Shape):
    def __init__(self, x, y, size):
        self.x = x
        self.y = y
        self.size = size

    def render(self, renderer):
        renderer.render_square(self.x, self.y, self.size)

class Circle(Shape):
    def __init__(self, x, y, size):
        self.x = x
        self.y = y
        self.size = size

    def render(self, renderer):
        renderer.render_circle(self.x, self.y, self.size)

class OpenGLRenderer(Renderer):
    def render_square(self, x, y, size):
        print(f"OpenGL renders square ({x},{y}) size {size}.")

    def render_circle(self, x, y, size):
        print(f"OpenGL renders circle ({x},{y}) size {size}.")

class Direct3DRenderer(Renderer):
    def render_square(self, x, y, size):
        print(f"Direct3D renders square ({x},{y}) size {size}.")

    def render_circle(self, x, y, size):
        print(f"Direct3D renders circle ({x},{y}) size {size}.")

square = Square(10, 10, 50)
circle = Circle(100, 100, 20)
opengl_renderer = OpenGLRenderer()
direct3d_renderer = Direct3DRenderer()
square.render(opengl_renderer)
circle.render(direct3d_renderer)

9. 建造者模式(Builder)

建造者模式是一种创建型模式,它使用多个简单的对象一步步构建成一个复杂的对象。它隐藏了对象的创建过程,并且允许以不同的方式构建对象。

示例:在一个游戏开发中,我们可能需要创建不同种类的角色。使用建造者模式,我们可以通过链式调用一些简单的对象构建方法来构建不同角色的实例。

class Character:
    def __init__(self):
        self.name = None
        self.gender = None
        self.armor = None
        self.weapon = None

class CharacterBuilder:
    def __init__(self):
        self.character = Character()

    def set_name(self, name):
        self.character.name = name
        return self

    def set_gender(self, gender):
        self.character.gender = gender
        return self

    def set_armor(self, armor):
        self.character.armor = armor
        return self

    def set_weapon(self, weapon):
        self.character.weapon = weapon
        return self

    def build(self):
        return self.character

builder = CharacterBuilder()
character = builder.set_name("Alice").set_gender("Female").set_armor("Leather Armor").set_weapon("Short Sword").build()
print(character.__dict__)

10. 迭代器模式(Iterator)

迭代器模式是一种行为型模式,它可以让我们逐步访问一个聚合对象的所有元素,并且不需要了解聚合对象的内部结构。这种模式通常用于遍历数据集合。

示例:在一个游戏开发中,我们可能需要迭代一些游戏对象。使用迭代器模式,我们可以使用迭代器对象逐步访问并且操作游戏对象的所有元素。

class GameObject:
    def __init__(self, name):
        self.name = name

class GameCollection:
    def __init__(self):
        self.game_objects = []

    def add_game_object(self, game_object):
        self.game_objects.append(game_object)

    def __iter__(self):
        return GameIterator(self)

class GameIterator:
    def __init__(self, collection):
        self.collection = collection
        self.index = 0

    def __next__(self):
        if self.index >= len(self.collection.game_objects):
            raise StopIteration()
        game_object = self.collection.game_objects[self.index]
        self.index += 1
        return game_object

game_collection = GameCollection()
game_collection.add_game_object(GameObject("Player"))
game_collection.add_game_object(GameObject("Enemy"))
for game_object in game_collection:
    print(game_object.__dict__)

11. 模板方法模式(Template Method)

模板方法模式是一种行为型模式,它定义了一种算法的框架,并且允许子类为其中的一些步骤提供具体实现。使用这种模式,可以确保算法的各个步骤按正确的顺序执行,并且留出接口给子类实现。

示例:在一个游戏开发中,我们可能需要定义一个游戏的基本流程,包括初始化、加载场景、展示场景、更新游戏等等。使用模板方法模式,我们可以定义一个基本流程框架,并且允许子类实现流程中的具体细节。

class Game:
    def initialize(self):
        print("Initialize game.")

    def get_scene(self):
        print("Getting game scene data.")

    def show_scene(self):
        print("Showing game scene.")

    def update_game(self):
        print("Updating game...")

    def run(self):
        self.initialize()
        self.get_scene()
        self.show_scene()
        self.update_game()

class SimpleGame(Game):
    def get_scene(self):
        print("Getting simple game scene data.")

    def show_scene(self):
        print("Showing simple game scene.")

simple_game = SimpleGame()
simple_game.run()

12. 状态模式(State)

状态模式是一种行为型模式,它定义了一个包含状态和行为的类,使得对象在运行时可以在不同的状态之间转换。使用这种模式,可以简化条件语句,使得代码更加清晰易懂。

示例:在一个游戏开发中,我们可能需要控制玩家的行动。使用状态模式,我们可以定义玩家的各种行为,并且允许玩家在各个行为之间切换。

class State:
    def run(self):
        pass

class NormalState(State):
    def run(self):
        print("Player is walking...")

class HurtState(State):
    def run(self):
        print("Player is crawling...")

class DeadState(State):
    def run(self):
        print("Player is dead... Game over.")

class Player:
    def __init__(self):
        self.state = NormalState()

    def set_state(self, state):
        self.state = state

    def run(self):
        self.state.run()

player = Player()
player.run()

player.set_state(HurtState())
player.run()

player.set_state(DeadState())
player.run()

以上是我给您的完整攻略,希望对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:最常用的12种设计模式小结 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • javascript时间戳和日期字符串相互转换代码(超简单)

    下面是详细讲解“javascript时间戳和日期字符串相互转换代码(超简单)”的攻略: 时间戳和日期字符串的定义 时间戳是1970年1月1日00:00:00(格林威治标准时间)起至现在的总秒数,通常为一个整数。 日期字符串是一个按照一定格式表示的时间文本,常用的格式包括“年-月-日 时:分:秒”、“月/日/年 时:分:秒”等。 时间戳转日期字符串 // 时间…

    JavaScript 2023年5月27日
    00
  • 浅谈JavaScript作用域和闭包

    浅谈JavaScript作用域和闭包 什么是JavaScript作用域? 在 JavaScript 中,每个变量、函数都有访问的范围,这就是作用域。JavaScript 中的作用域可以是全局作用域和局部作用域。 全局作用域 全局作用域可以定义在 JavaScript 代码的最外层范围内,即最顶层作用域。在全局作用域内定义的变量和函数可以在代码的任何地方访问。…

    JavaScript 2023年6月10日
    00
  • javascript实现仿银行密码输入框效果的代码

    要实现仿银行密码输入框效果的代码,可以参考如下的攻略: 1. HTML代码 首先,在HTML中需要创建一个文本框,该文本框用于输入密码。为了保证输入的密码的安全性,我们需要将该文本框的type属性设置为password,例如: <input type="password" id="password" /> …

    JavaScript 2023年6月11日
    00
  • 在页面上点击任一链接时触发一个事件的代码

    要实现在页面上点击任一链接时触发一个事件的代码,可以通过以下步骤来实现: 第一步:添加一个事件监听器 在页面中添加一个事件监听器来监听所有a标签的点击事件,代码如下: document.addEventListener(‘click’, function(event) { if (event.target.tagName === ‘A’) { // 点击事件…

    JavaScript 2023年6月11日
    00
  • JS身份证信息验证正则表达式

    下面是JS身份证信息验证正则表达式的完整攻略: 什么是身份证号码 身份证号码是我国公民的唯一身份标识,由18位数字和字母组成,其中最后一位可能是数字或字母X,具有以下含义: 前6位是地址码,表示身份证持有人的行政区划代码; 7到14位是出生日期码,表示身份证持有人的出生年月日; 15到17位称为顺序码,表示在同一地址码区域内,对同年、同月、同日出生的人员编定…

    JavaScript 2023年5月19日
    00
  • Javascript点击其他任意地方隐藏关闭DIV实例

    好的。您想实现的效果是当用户在页面上点击除某个指定的div以外的其它任何地方时,可以将该指定的div隐藏起来。实现这个功能可以使用JavaScript。 下面是实现该功能的完整攻略: 1.在HTML中添加div元素 首先,在HTML文档中添加包含需要隐藏的内容的div元素。例如,下面的代码创建一个div元素: <div id="myDiv&q…

    JavaScript 2023年6月11日
    00
  • javascript

    1970.1.1互联网开始时间 **JavaScript ( 开发Web页面的脚本语言 )** 是面向 Web 的编程语言,获得了所有网页浏览器的支持,是目前使用最广泛的脚本编程语言之一,也是网页设计和 Web 应用必须掌握的基本工具。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的…

    JavaScript 2023年4月18日
    00
  • Vue Router路由hash模式与history模式详细介绍

    Vue Router路由hash模式与history模式详细介绍 在Vue.js中,Vue Router是一个常用的路由管理器。Vue Router可以实现单页应用(SPA)的路由功能。在Vue Router中,有两种路由模式:hash模式和history模式。在本文中,我们将详细介绍这两种模式的区别和使用方法。 hash模式 hash模式是Vue Rout…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部