大话设计模型 Task05 状态、适配、单例

news2024/11/17 23:53:15

目录

  • 一、状态模式
    • 问题描述
    • 问题分析
    • 模式定义
    • 代码实现
  • 二、适配器模式
    • 问题描述
    • 问题分析
    • 模式定义
    • 代码实现
  • 三、单例模式
    • 问题描述
    • 问题分析
    • 模式定义
    • 代码实现

一、状态模式

问题描述

假设我们要描述一名员工一天不同时间的工作状态,正常来看是比较简单的,直接从早上上班开始,根据一些时间变化切换到其他状态。但假设我们切换到一个状态后又可能需要根据另外的条件再次切换,比如本来在写代码,到晚上了还没写完,继续写。好不容易写完了,需要切换到下班状态;或者没写完,直到睡着还没写完。这需要各种条件判断(每个状态都要判断是否满足跳到其他状态),不光是写起来复杂,新增状态和更新状态更是会变得异常麻烦。

此时,很自然我们就会想要将一个个状态独立出来,为每个状态设置所有需要的切换条件,在状态发生变化时改变对应的行为。这样我们只需要关心状态从 A 转换到 B,而不用管各种判断逻辑。

问题分析

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

模式定义

状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
在这里插入图片描述

代码实现

# 工作状态
class State(object):
    def write_program(self,w):
        pass

# 睡眠状态
class SleepingState(State):
    def write_program(self, w):
        print(f"当前时间:{w.hour}点 不行了,睡着了。")

# 下班休息状态
class RestState(State):
    def write_program(self, w):
        print(f"当前时间:{w.hour}点 下班回家了")

# 晚间工作状态
class EveningState(State):
    def write_program(self, w):
        if w.taskFinished:
            w.set_state(RestState())
            w.write_program()
        else:
            if w.hour < 21:
                print(f"当前时间:{w.hour}点 加班哦,疲累之极")
            else:
                w.set_state(SleepingState())
                w.write_program()

# 下午工作状态
class AfternoonState(State):
    def write_program(self, w):
        if w.hour < 17:
            print(f"当前时间:{w.hour}点 下午状态还不错,继续努力")
        else:
            w.set_state(EveningState())
            w.write_program()

# 中午工作状态
class NoonState(State):
    def write_program(self, w):
        if w.hour < 13:
            print(f"当前时间:{w.hour}点 饿了,午饭;犯困,午休。")
        else:
            w.set_state(AfternoonState())
            w.write_program()

# 上午工作状态
class ForenoonState(State):
    def write_program(self, w):
        if w.hour < 12:
            print(f"当前时间:{w.hour}点 上午工作,精神百倍")
        else:
            w.set_state(NoonState())
            w.write_program()

# 工作
class Work(object):
    __current = None
    __hour = None
    __finish = False
    def __init__(self):
        self.__current = ForenoonState()

    def set_state(self,s:State):
        self.__current = s
    def write_program(self):
        self.__current.write_program(self)

    def get_hour(self):
        return self.__hour
    def set_hour(self,hour):
        self.__hour = hour
    def get_finish(self):
        return self.__finish
    def set_finish(self,finish):
        self.__finish = finish
    hour = property(get_hour,set_hour)
    taskFinished = property(get_finish,set_finish)


if __name__ == '__main__':
    # 紧急项目
    emergencyProjects = Work()
    emergencyProjects.hour = 9
    emergencyProjects.write_program()
    emergencyProjects.hour = 10
    emergencyProjects.write_program()
    emergencyProjects.hour = 12
    emergencyProjects.write_program()
    emergencyProjects.hour = 13
    emergencyProjects.write_program()
    emergencyProjects.hour = 14
    emergencyProjects.write_program()
    emergencyProjects.hour = 17

    emergencyProjects.taskFinished = False

    emergencyProjects.write_program()
    emergencyProjects.hour = 19
    emergencyProjects.write_program()
    emergencyProjects.hour = 22
    emergencyProjects.write_program()

二、适配器模式

问题描述

想象我们要出国旅游,到了异国他乡不懂当地语言怎么办?路上卯足马力突击学习?当然可以!不过更简单的做法是,打开手机翻译软件,切换到「当地语言-中文」就可以借助它与当地人进行对话了。这样,只要我们手机里有其他语言与中文的互译,就可以走遍地球任意一个角落并和当地人沟通了,而且我们自己并不需要真正掌握任何一门外语。

当然,有时候用翻译软件有点麻烦,有不准确的情况。此时,可以在当地找一个翻译,比如领导人出访国外时会带一个翻译,刚去 NBA 打球的姚明也随时有一个翻译在身边。

问题分析

中文与其他语言的互译器以及翻译人员就是适配器,我们自己或姚明就是那个已有的满足功能的类,接口和环境就是异国他乡。

模式定义

适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

代码实现

# 球员
class Player(object):
    name = ""
    def __init__(self,name):
        self.name = name
    def attack(self):
        pass
    def defense(self):
        pass

# 前锋
class Forwards(Player):
    name = ""
    def __init__(self,name):
        self.name = name
    def attack(self):
        print(f"前锋 {self.name} 进攻")
    def defense(self):
        print(f"前锋 {self.name} 防守")

# 中锋
class Center(Player):
    name = ""
    def __init__(self,name):
        self.name = name
    def attack(self):
        print(f"中锋 {self.name} 进攻")
    def defense(self):
        print(f"中锋 {self.name} 防守")

# 后卫
class Guards(Player):
    name = ""
    def __init__(self,name):
        self.name = name
    def attack(self):
        print(f"后卫 {self.name} 进攻")
    def defense(self):
        print(f"后卫 {self.name} 防守")

# 外籍中锋
class ForeignCenter:
    __name = ""
    def __init__(self):
        pass
    def 进攻(self):
        print(f"外籍中锋 {self.name} 进攻")
    def 防守(self):
        print(f"外籍中锋 {self.name} 防守")

    def get_name(self):
        return self.__name
    def set_name(self,name):
        self.__name = name
    name = property(get_name,set_name)

# 翻译者
class Translator(Player):
    __wjzf = ForeignCenter()
    def __init__(self,name):
        self.__wjzf.name = name
    def attack(self):
        self.__wjzf.进攻()
    def defense(self):
        self.__wjzf.防守()

if __name__ == '__main__':
    b = Forwards("巴蒂尔")
    b.attack()
    m = Guards("麦克格雷迪")
    m.attack()

    ym = Translator("姚明")
    ym.attack()
    ym.defense()

三、单例模式

问题描述

一个类只能有一个实例在生活中是很常见的,比如打印机程序,政府部门。当我们创建这些类的实例时,我们希望每次创建后得到的都是同一个实例。很直观地,我们知道需要在构造函数上下功夫,当我们需要创建一个新的实例时,如果已经有了该类的实例,就直接返回,而不是新建一个。

问题分析

对一些只需要一个全局实例的情况,推荐使用单例模式。

模式定义

单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。

通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

代码实现

import time
import threading

class Singleton(object):
    # 线程锁
    lock = threading.Lock()
    def __new__(cls,*args,**kwargs):
        # 双重锁定
        if not hasattr(cls,'_instance'):
            with cls.lock:
                if not hasattr(cls,'_instance'):
                    time.sleep(0.5)
                    orig = super(Singleton,cls)
                    cls._instance = orig.__new__(cls,*args,**kwargs)
        return cls._instance

def func():
        obj = Singleton()
        print(id(obj))

if __name__ == '__main__':
    a = Singleton()
    b = Singleton()
    if a == b:
        print("两个对象是相同的实例。")

    # 多线程测试
    for i in range(10):
        thread = threading.Thread(target=func)
        thread.start()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/113222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

卡塔尔世界杯半自动越位识别技术(SAOT)的工作原理

随着卡塔尔世界杯的深入举行&#xff0c;半自动越位识别技术 (Semi-automated offside technology&#xff0c;简称为 SAOT) 这项数字技术正在被越来越多的国内外球迷所熟知。 作为 VAR(Video Assistant Referee&#xff0c;视频助理裁判) 的扩展&#xff0c;SAOT 的引入是为了…

腾讯云轻量应用服务器使用 OpenFaaS 部署云函数!

OpenFaaS 是开源的流行 FaaS&#xff08;Function-as-a-Service&#xff0c;函数即服务&#xff09;框架&#xff0c;OpenFaaS 让开发者聚焦业务代码的编写&#xff0c;无需过多关注语言框架、部署、配置等其他步骤。 轻量应用服务器 Lighthouse 为您提供了 OpenFaaS 应用镜像…

C语言程序设计--个人账簿管理系统

目的在于&#xff1a; 为编码人员提供依据&#xff1b;为修改、维护提供条件&#xff1b;项目负责人将按计划书的要求布置和控制开发工作全过程&#xff1b;项目质量保证组将按此计划书做阶段性和总结性的质量验证和确认。 本说明书的预期读者包括&#xff1a; 项目开发人员&…

车用DC-DC模块 1224V转5V2A过认证大塑料外壳

名称&#xff1a;车用12V转5V2A电源转换器 型号&#xff1a;LM40J5V2A3S 性质&#xff1a;非隔离型的BUCK电源转换器&#xff0c; 特点&#xff1a;采用集成IC设计&#xff0c;具有转换效率高&#xff0c;体积小&#xff0c;稳定可靠的特点&#xff0c;采用灌胶工艺&#xf…

Arcgis使用教程(十三)ARCGIS地图制图之地图输出参数设置详解

目录 1.加载数据 2.页面大小设置 2.1 根据页面大小设置地图 2.2 根据固定比例尺设置页面大小 1.加载数据 在Arcmap中加载中国矢量图层数据&#xff08;中国省级行政区图&#xff0c;国界线两个图层&#xff09;&#xff0c;切换到Layout View窗口&#xff0c;设置地图符号要…

jvm-sandbox-repeater环境搭建

引流回放这个技术现在真的越来越成为了很多公司测试同学必备的一个工具了。当然引流回放的技术有很多&#xff0c;比如下来会提到的jvm-sandbox-repeater。 当然你也可以通过日志分析解析的方式去获取到请求返回的信息等。因为刚听过testerhome开发者大会&#xff0c;好几个主题…

不愧是阿里内部的「排序和数据结构学习笔记」面面俱到、太全了

算法——成为程序员强者的必经之路 算法到底有多重要不必多说&#xff0c;说「算法正在统治世界」也不为过。 在编程行业内&#xff0c;有句话是这么说的「薪资越高、算法越重要」&#xff0c;互联网头部企业花费了大量的时间和金钱&#xff0c;用来研究新算法&#xff0c;不…

Python pandas有几千个库函数,你用过几个?(6)

上一篇链接&#xff1a; Python pandas有好几百个库函数&#xff0c;你都用过吗&#xff08;5&#xff09;_Hann Yang的博客-CSDN博客 DataFrame 类方法&#xff08;211个&#xff0c;其中包含18个子类、2个子模块&#xff09; >>> import pandas as pd >>&g…

详解c++---string的介绍(下)

这里写目录标题前言string的Modifiersoperatorappendpush_backassigninserterasereplaceswappop_backString的operationsc_strcopyfindrfindfind_first_offind_last_offind_first_not_of和find_last_not_of前言 本片文章我们将继续介绍string的使用&#xff0c;点击&#xff1…

从IP V4 向IP V6 过渡(计算机网络-网络层)

目录 从IP V4 向IP V6 过渡 用双协议栈进行从 IPv4 到 IPv6 的过渡 使用隧道技术从 IPv4 到 IPv6 过渡 从IP V4 向IP V6 过渡 向 IPv6 过渡只能采用逐步演进的办法&#xff0c;同时&#xff0c;还必须使新安装的 IPv6 系统能够向后兼容 IPv6 系统必须能够接收和转发 IPv4 分…

node.js+uni计算机毕设项目基于微信小程序停车系统(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

node.js+uni计算机毕设项目基于微信小程序的订房系统(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

【12.23-12.24】Member Inference Attack

文章目录前言一、Repeated Knowledge Distillation with Confidence Masking to Mitigate Membership Inference Attacks1.1 Member Inference Attack2.2 Confidence Score Masking2.3 Knowledge Distillation二、Membership Inference Attacks Against Machine Learning Model…

垃圾收集器

1.术语 (1).吞吐量 CPU用于运行用户代码的时间与CPU总消耗的比值。 (2).全局停顿(Stop The World) 是在垃圾回收过程中&#xff0c;需要将JVM内存冻结的一种状态。在全局停顿状态下&#xff0c;除GC线程外&#xff0c;Java其它线程都是停止执行的&#xff0c;本地方法可以执行…

二叉树15:左叶子之和

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;404. 左叶子之和 题目&#xff1a; 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例&#xff1a…

支持设备的待机唤醒功能

系统待机唤醒功能 1 说明背景 1.1 需求 支持 GPU 进入低功耗模式&#xff0c;让用户选择降低设备的功耗 1.2 概念 上位词&#xff1a;APM, ACPI 同类词&#xff1a;睡眠模式, S0~S5 下位词&#xff1a;系统挂起, 系统唤醒, 运行时设备电源管理 1&#xff09;ACPI 在计算机…

Rabbit MQ的基本使用

目录 1. MQ是什么&#xff0c;有哪些作用&#xff1f; 2. 主要的MQ框架有哪些&#xff1f; 3. RabbitMQ安装 4. RabbitMQ中的主要概念 5. 消息队列的核心概念 6. 一个简单的生产者和消费者示例。 6.1 消息发送者模块 1. MQ是什么&#xff0c;有哪些作用&#xff1f; 消…

Jenkins配合git构建持续构建流程

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 理解CI CI(Continuous Integration)翻译成持续集成&#xff0c;是指在源代码变更后自动检测、检出、构建、自动化测试到发布的过程。常见的开源CI工具有J…

Go类型与进制

iota:总是从0开始&#xff0c;递增为1的整数 一、进制 二进制0b1001000 0100 1000 八进制 0o110 01 001 000》 1 * 8^21 * 8^10 * 8^072 十六进制0x48 0100 1000 十进制转二进制 除以基数2&#xff0c;直到商为0为止&#xff0c;反向提取余数。 转为十六进制 除以基…

机器视觉(六):频域图像增强

目录&#xff1a; 机器视觉&#xff08;一&#xff09;&#xff1a;概述 机器视觉&#xff08;二&#xff09;&#xff1a;机器视觉硬件技术 机器视觉&#xff08;三&#xff09;&#xff1a;摄像机标定技术 机器视觉&#xff08;四&#xff09;&#xff1a;空域图像增强 …