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

yizhihongxing

您好,以下是我对“最常用的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日

相关文章

  • JS遍历页面所有对象属性及实现方法

    JS遍历页面所有对象属性及实现方法 在JavaScript中,对象是一个非常重要的概念,通过对象可以将多种类型的数据(属性)和方法(函数)组合到一起,实现对数据的封装和操作。在前端开发中,遍历页面中所有的对象属性是非常常见的需求,本文将介绍如何实现这一功能。 1. for…in循环 for…in循环是JavaScript中遍历对象属性的一种基本方法,…

    JavaScript 2023年5月27日
    00
  • JavaScript 学习笔记之操作符(续)

    JavaScript 学习笔记之操作符(续) 前言 在之前的文章中,我们已经讲解了 JavaScript 中的基本操作符,本文将延续该话题,再次强调一些高级操作符的使用方法。 递增(++)和递减(–) ++ 和 — 操作符用于将变量的值加一或减一。当它们出现在变量前面时,会先进行加减操作,再将修改后的值赋给变量。如果它们出现在变量的后面,则先将变量的值赋…

    JavaScript 2023年5月18日
    00
  • javascript md5加密代码

    请允许我详细讲解一下 Javascript 编程语言中如何实现 MD5 哈希加密。 什么是 MD5 哈希加密 MD5 是一种哈希算法,可以将任意长度的数据块进行不可逆转的压缩,它被广泛用于密码学的应用中,以保证密码的安全性。MD5 可以将任意长度的消息压缩为 128 bit 的摘要,并且具有不可逆性、唯一性、高效性等特点。 MD5 加密的 Javascrip…

    JavaScript 2023年5月19日
    00
  • js获取文件里面的所有文件名(实例)

    下面是关于“js获取文件里面的所有文件名”的详细攻略: 1. 通过Ajax请求读取文件列表 首先,我们可以通过使用Ajax请求来获取文件目录下的所有文件名称,具体步骤如下: 1.1 创建一个XMLHttpRequest对象 var xhr = new XMLHttpRequest(); 1.2 发送请求并指定请求方式和请求地址 xhr.open(‘GET’,…

    JavaScript 2023年5月27日
    00
  • JS实现PC手机端和嵌入式滑动拼图验证码三种效果

    实现PC手机端和嵌入式滑动拼图验证码,可以使用JS库“SlideVerify”,该库可以轻松地实现滑动验证码。下面是实现过程的完整攻略。 步骤一:引入SlideVerify库 在HTML文档中引入SlideVerify库,可以通过以下方式引入: <script src="path/to/SlideVerify.js"><…

    JavaScript 2023年6月10日
    00
  • jQuery拖拽 & 弹出层 介绍与示例

    下面我将详细讲解“jQuery拖拽 & 弹出层 介绍与示例”的完整攻略。本攻略包含以下四个主要部分: jQuery拖拽的介绍 jQuery拖拽的实现方法 jQuery弹出层的介绍 jQuery弹出层的实现方法 1. jQuery拖拽的介绍 jQuery拖拽是指在页面中,用鼠标来拖拽页面上的元素,实现元素的位置移动效果。jQuery拖拽非常常见,尤其是…

    JavaScript 2023年6月11日
    00
  • javascript动态分页的实现方法实例

    对于”javascript动态分页的实现方法实例”,实现的步骤和示例说明如下: 1. 实现方法 1.1. 前端实现 首先,需要在页面中添加分页控制按钮,如:首页、上一页、下一页和尾页等。 绑定按钮点击事件,点击按钮后触发相应的分页事件。 在JavaScript中编写分页事件,实现分页功能。当用户点击分页按钮时,会将不同的页码传递到JavaScript函数中。…

    JavaScript 2023年5月27日
    00
  • iOS基于CATransition实现翻页、旋转等动画效果

    下面我将详细讲解如何使用iOS的CATransition实现翻页、旋转等动画效果。 1. 简介 iOS的CATransition动画是一种Core Animation库提供的、基于图层的动画,它可以实现一些非常酷炫的动画效果,包括翻页、旋转、淡入淡出等效果。 2. 实现方法 在iOS中,使用CATransition动画非常简单,只需要按照以下步骤操作: 2.…

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