程序设计

手雷爆炸

"""
以面向对象思想,描述下列情景:
情景:手雷爆炸,可能伤害敌人(头顶爆字)或者玩家(碎屏)。
变化:还可能伤害房子、树、鸭子....
要求:增加新事物,不影响手雷.
"""

class Grenade:
    def boom(self,target):
        print("手雷爆炸")
        target.struck()

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

    def struck(self):
        pass


class Player(Target):
    def struck(self):
        print(self.name + "(碎屏)")

class House(Target):
    def struck(self):
        print(self.name+"(倒塌)")

g = Grenade()
player = Player("玩家")
house = House("房子")
g.boom(player)
g.boom(house)

员工管理器

"""
有一家公司有如下几种岗位:
    -- 程序员:底薪 + 项目分红
    -- 测试员:底薪 + Bug数*5
    -- ...
创建员工管理器:
    -- 记录所有员工
    -- 计算所有员工总薪资
封装:程序员/测试员/员工管理器
继承:创建员工类,隔离员工管理器与程序员和测试员的变化
多态:程序员/测试员重写员工类的计算薪资方法
"""

class Staff:
    def __init__(self,money):
        self.money = money

    def get_money(self):
        return self.money

class Programmer(Staff):
    def __init__(self,money,com):
        super().__init__(money)
        self.com = com

    def get_money(self):
        return super().get_money() + self.com

class Tester(Staff):
    def __init__(self,money,num):
        super().__init__(money)
        self.num = num

    def get_money(self):
        return super().get_money() + self.num*5

class StaffController:
    def __init__(self):
        self.__clist = []
        pass

    def add_clist(self,staff):
        if isinstance(staff,Staff):
            self.__clist.append(staff)

    def select(self):
        return self.__clist

    def get_all_money(self):
        all_money = 0
        for i in self.__clist:
            all_money += i.get_money()
        return all_money

staff = StaffController()
staff.add_clist(Programmer(5000, 3000))
staff.add_clist(Tester(3000, 3))




print(Programmer(5000,3000).get_money())
print(Tester(3000,3).get_money())
print(staff.get_all_money())

创建图形管理器

"""
创建图形管理器
-- 记录多种图形(圆形、矩形....)
-- 提供计算总面积的方法.
要求:增加新图形,不影响图形管理器.
测试:
 创建图形管理器,存储多个图形对象。
 通过图形管理器,调用计算总面积方法.
"""

class Graphical:
    def __init__(self,name=''):
        self.name = name
    def get_area(self):
        pass

class Rectangle(Graphical):
    def __init__(self,name,l,w):
        super().__init__(name)
        self.l = l
        self.w = w

    def get_area(self):
        return self.l * self.w


class Circular(Graphical):
    def __init__(self,name,r):
        super().__init__(name)
        self.r = r

    def get_area(self):
        return 3.14 * self.r * self.r

class GraphicalController:
    def __init__(self):
        self.__glist = []

    def add_glist(self,graphical):
        if isinstance(graphical,Graphical):
            self.__glist.append(graphical)
    def get_all_area(self):
        sum = 0
        for i in self.__glist:
           sum += i.get_area()
        return sum

g = GraphicalController()
g.add_glist(Rectangle('矩形',3,3))
g.add_glist(Circular('圆形',3))
print(g.get_all_area())