设计模式应用

设计模式应用

一、一对多关系

1、观察者

class Person(object):
    def __init__(self,name):
        self.name = name

class Sentry(Person):
    def __init__(self,name):
        super(Sentry,self).__init__(name)
        self.perlist = []

    def treebanch(self,objs):
        self.perlist.append(objs)
    def warning(self):
        for odj in self.perlist:
            odj.action()

class Lian1(Person):
    def __init__(self,name):
        super(Lian1,self).__init__(name)

    def action(self):
        print "lian1 running"

class Lian2(Person):
    def __init__(self,name):
        super(Lian2,self).__init__(name)

    def action(self):
        print "lian2 jump"
class Gun():
    def paohong(self):
        print 'paohong'
gun = Gun()
lian1 = Lian1('1lian')
lian2 = Lian2('2lian')
sentry = Sentry('s')
sentry.treebanch(lian1)
sentry.treebanch(lian2)

gun.paohong()
sentry.warning()

2、工厂模式

class Addoper():
    def getResult(self):
        return self.r1 + self.r2

class Suboper():
    def getResult(self):
        return self.r1 - self.r2

class Muloper():
    def getResult(self):
        return self.r1 * self.r2

class Divoper():
    def getResult(self):
        return self.r1/self.r2

class Factoryoper(object):
    def __init__(self):
        self.oper_map = {}
        self.oper_map['+']=Addoper()
        self.oper_map['-']=Suboper()
        self.oper_map['*']=Muloper()
        self.oper_map['//']=Divoper()

    def createOper(self,guide):
        return self.oper_map[guide]

factory = Factoryoper()
o1 = raw_input("a:")
o2 = raw_input("b:")
op =  raw_input("operant:")

product = factory.createOper(op)

product.r1 = int(o1)
product.r2 = int(o2)
r = product.getResult()
print r

 定义加减运算类的时候不用将待处理的数据设置在 __init__中,而是在环境中赋值,就能完成操作。好处是工厂类中不用去关心调用一个操作类定义对象时,要输入什么数值。

 总结:以上两种方法都是一个激励过来后,有一个响应源做出反应,然后传达给各个单元。

           关系定义(环境):都是先由响应源收集单元,触发单元变化。

3 抽象工厂模式

    抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
    优点:易于交换“产品系列”,只要更改相应的工厂即可。
    缺点:建立产品的时候很繁琐,需要增加和修改很多东西。

    优化1:为了避免客户端有过多的逻辑判断,可以封装出一个简单工厂类来生成产品类。
    优化2:为了减少简单工厂类里面的逻辑判断,可以采用“反射”机制,直接根据外部的配置文件读取出需要使用产品类的信息。

 

一对一

适配器模式

class Computer():
    def connectScreen8(self,screen):
        print "connect screen Screen8"
        screen.screen8()

class Screen16():
    def connector(self):
        print "computer connect"

class Adapt():
    def __init__(self):
        self.screen16obj = Screen16()

    def screen8(self):
        print "to screen------------"
        self.screen16obj.connector()

c = Computer()
screen = Screen16()
a = Adapt()
c.connectScreen8(a)

 

树状机构,抽象工厂方法

         入口 接收入参

     抽象工厂方法1     抽象工厂2

工厂1                       工厂2  工厂2.1

产品1                     产品2 产品2.1

用字典的方法作为映射,一级一级汇总。

#-*- coding:utf-8 -*-

__author__ = 'lWX330844'


class Car():
    def advantage(self):
        print "running"

    def __str__(self):
        return "it is a car"

class Carwh():
    def speed(self):
        print "two wh"
class Truck():
    def speed(self):
        print "four wh"
class Truckwh():
    def advantage(self):
        print "weight"

    def __str__(self):
        return "it is a Truck"

class FactoryCar():
    def __init__(self):
        self.productmap = {"Car":Car,"Carwh":Carwh}

class FactoryTruck():
    def __init__(self):
        self.productmap = {"Truck":Truck,"Truckwh":Truckwh}

class Product():
    def __init__(self):
        self.factorymap = {"car":FactoryCar,"truck":FactoryTruck}

dingdan = "car"
prod = Product()
print prod.factorymap[dingdan]().productmap["Car"]()
prod.factorymap[dingdan]().productmap["Car"]().advantage()

 当然在实际的应用中也可以使用文件结构的形式,来一级一级找到路由。

    a文件夹/

         __init__.py

         bench文件夹

               __init__.py

               USA文件夹/

                        __init__.py

                          U.py

     在__init__.py文件中引用from bench.USA import U 这样就能路由到想要应用的函数了。

 

 

 

 

  

posted on 2017-02-20 20:30  lexn  阅读(91)  评论(0编辑  收藏  举报

导航