最常用的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语法和定时函数 JavaScript语法 JavaScript是一种基于对象的脚本语言,主要应用于Web前端和服务器端的开发。下面我们来简单介绍一下JavaScript的语法: 数据类型 JavaScript的数据类型包括:字符串、数字、布尔值、对象、数组、null和undefined。 示例代码: var str = ‘hello’…

    JavaScript 2023年5月27日
    00
  • javascript实现跟随鼠标移动的图片

    以下是Javascript实现跟随鼠标移动的图片的完整攻略: 第一步:HTML 模板 首先,我们需要创建一个包含图片的 HTML 模板。可以按照以下示例来创建一个基本 HTML 模板: <!DOCTYPE html> <html> <head> <title>跟随鼠标移动的图片</title> &l…

    JavaScript 2023年6月11日
    00
  • JavaScript中reduce()方法的使用详解

    JavaScript中reduce()方法的使用详解 1. 什么是reduce()方法 reduce()是JavaScript中的高阶函数,用于对数组中的所有元素进行迭代,并将它们缩减为单个值。它接受一个回调函数作为参数,该回调函数执行一个累加器和当前元素之间的操作,将最终结果返回。 reduce()方法的语法如下: arr.reduce(callback[…

    JavaScript 2023年5月27日
    00
  • Vue Router深扒实现原理

    Vue Router深扒实现原理 Vue Router 是 Vue.js 官方的路由管理器插件,是构建 Vue.js 单页应用程序必不可少的工具之一。Vue Router 提供了诸如路由参数、路由匹配、嵌套路由等功能,可以帮助我们快速构建复杂的应用程序。本文将深入剖析 Vue Router 的实现原理,包括路由映射、导航守卫、懒加载等方面。 路由映射 在 V…

    JavaScript 2023年6月11日
    00
  • javascript实现时间日期的格式化的方法汇总

    标题 Javascript实现时间日期的格式化的方法汇总 介绍在Javascript中,实现时间日期格式化可以通过Date对象的方法和第三方库moment.js等方式来实现。本文汇总了几种常见的实现方式,并提供相关的示例说明。 方法1:使用Date对象的方法 在Javascript中,可以使用Date对象的方法对时间日期进行格式化。下面是一个例子,展示如何使…

    JavaScript 2023年5月27日
    00
  • JS实现表单验证功能(验证手机号是否存在,验证码倒计时)

    请看下面的攻略。 JS实现表单验证功能(验证手机号是否存在,验证码倒计时) 概述 表单验证是Web开发中非常常见的操作,通常的表单验证方式是利用前后端的交互获取数据进行验证,但是这种方式需要进行网络请求,不仅影响用户体验,也增加了服务器的负担。而JS实现表单验证则可以在不进行网络请求的情况下,对用户输入的数据进行实时验证,从而提高用户体验以及减轻服务器压力。…

    JavaScript 2023年6月10日
    00
  • JS面向对象编程之对象使用分析

    关于JS面向对象编程之对象使用分析,我为您提供如下完整攻略: 什么是对象 首先,我们需要了解对象的概念和基本特征。对象是一种复合数据类型,它将各种数据结构封装在一起,表示某一个东西。对象的每个属性都有一个键(或者说叫属性名)和值,键可以是字符串或者符号,值可以是任意数据类型,包括基本数据类型、对象、函数等。对象可以通过字面量、构造函数和对象实例三种方式创建。…

    JavaScript 2023年5月27日
    00
  • 深入分析JQuery和JavaScript的异同

    深入分析 jQuery 和 JavaScript 的异同 JavaScript 是一门编程语言,而 jQuery 则是建立在 JavaScript 语言上的一个开源库。在许多方面,jQuery 帮助简化了JavaScript 编程,但也有一些重要的异同点需要我们深入了解。本文将会介绍这些异同点。 引入方式 在你能够使用 jQuery 或 JavaScript…

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