组合的实现

Posted qiangayz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了组合的实现相关的知识,希望对你有一定的参考价值。

组合的场景出现在两个类需要协同工作的时候,这个时候需要考虑到解耦,不能让两个类之间有直接的关系,因为有可能有功能相似的类作用于第三个类里面

例如两个处理数据库的类功能相等,但是分为两个,如果Userinfo里面写死,就不能用第三个类了

实现原理:把一个对象当做参数传进来,而不是在该类的内部实例化,这样降低了类和类之间的耦合。

class SqlHelper:
    def get_one_data(self):
        pass
    def get_many_data(self):
        pass
    def get_all_data(self):
        pass
class mysqlHelper:
    def get_one_data(self):
        pass
    def get_many_data(self):
        pass
    def get_all_data(self):
        pass

class UserInfo:
    def __init__(self,helper):
        #self.sql = SqlHelper()
        self.sql = helper

    def login(self):
        #数据库操作
        self.sql.get_one_data()

    def user_list(self):
        self.sql.get_all_data()

h = SqlHelper()
obj = UserInfo(h)
obj.login()

  

另一种场景:

如果SQL函数还依赖一个类,即使用SQL类的时候同样的需要初始化一个类,然后把这个类当做参数传进来。

class foo:
    def f1(self):
        pass
    def f2(self):
        pass

class SqlHelper:
    def __init__(self,f):
        self.foo = f
    def get_one_data(self):
        self.foo.f1()
        pass
    def get_many_data(self):
        pass
    def get_all_data(self):
        pass
class MysqlHelper:
    def __init__(self,f):
        self.foo = f
    def get_one_data(self):
        pass
    def get_many_data(self):
        pass
    def get_all_data(self):
        pass

class UserInfo:
    def __init__(self,helper):
        #self.sql = SqlHelper()
        self.sql = helper

    def login(self):
        #数据库操作
        self.sql.get_one_data()

    def user_list(self):
        self.sql.get_all_data()

f = foo()
h = SqlHelper(f)
obj = UserInfo(h)
obj.login()

  

这样会出现的问题,架构越来越大,层级越来越盛,有没有一种方法可以省略掉之前的继承

以上是关于组合的实现的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 代码片段

48个值得掌握的JavaScript代码片段(上)

如何组合绑定片段而不将它们包装在 XML 文字中

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!(转载)

片段组合在 Relay 中是如何工作的?

为 memcached 和 Rails 组合片段和对象缓存的最佳方式