python状态模式-小试牛刀

状态模式

什么是状态模式,所谓状态模式是指对象在不同的状态下有不同的行为,这种不同的行为就好像是不同的类一样.

举例说明

在一个公司中,每个人都有自己的岗位和职责,假如我们实例化了两个人小白和小黄,都是公司的员工,结果天掉馅饼,小白被公司晋升为了经理,那小白的工作职能就改变了.这里就可以用状态模式来实现,当小白的身份状态变化时,其对应的行为方法也将改变!

Code(Python)

#encoding=utf-8
"""
状态模式小例程
"""
# 行为类,记录工作者所有存在的行为
class WorkerState(object):
    def work(self):
        pass
    def resign(self):
        pass
    def makeplan(self, plan):
        pass

class Staff(object):
    def work(self):
        print("staff work")
    def resign(self):
        print("I am resigning")
    def makeplan(self, plan):
        print("sorry, you don't have power to make plan")

class CEO(object):
    def work(self):
        print("ceo work")
    def resign(self):
        print("ceo resigning")
    def makeplan(self, plan):
        print("ceo are making "+plan)

class Worker(object):
    def __init__(self, name):
        self.name = name
        self.setState(Staff())
    def getState(self):
        return self.worker_state
    def setState(self, worker_state):
        self.worker_state = worker_state
    def work(self):
        self.worker_state.work()
    def resign(self):
        self.worker_state.resign()
    def makeplan(self, plan):
        self.worker_state.makeplan(plan)

class Company(object):
    def __init__(self, name):
        self.name = name
        self.persons = {}
    def addPerson(self, person):
        self.persons[person.name] = person
    def delPerson(self, person):
        del self.persons[person.name]
        person.resign()
    def listPerson(self):
        for key in self.persons.keys():
            print(self.persons[key].name)
    def setCEO(self, person):
        person.setState(CEO())
        self.ceo = person

sanguo = Company("SAN GUO")
liubei = Worker("Liu Bei")
guanyu = Worker("Guan YU")
zhangfei = Worker("Zhang Fei")
zhaoyun = Worker("Zhao Yun")
zhugeliang = Worker("Zhuge Liang")
machao = Worker("Ma Chao")
pangtong = Worker("Pang Tong")
huangzhong = Worker("Huang Zhong")
sanguo.addPerson(liubei)
sanguo.addPerson(guanyu)
sanguo.addPerson(zhangfei)
sanguo.addPerson(zhaoyun)
sanguo.addPerson(zhugeliang)
sanguo.addPerson(machao)
sanguo.addPerson(pangtong)
sanguo.addPerson(huangzhong)
sanguo.setCEO(liubei)
sanguo.listPerson()
liubei.makeplan("兴复汉室")
for person in sanguo.persons.values():
    person.work()

输出为:

Liu Bei
Ma Chao
Zhang Fei
Huang Zhong
Guan YU
Pang Tong
Zhao Yun
Zhuge Liang
ceo are making 兴复汉室
ceo work
staff work
staff work
staff work
staff work
staff work
staff work
staff work
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值