zoukankan      html  css  js  c++  java
  • 设计模式 Mixin (混入类)

    混入(mix-in)类代表类之间的另一种关系。在C++中,混入类的语法类似于多重继承,但是语义完全不同。混入类回答"这个类还可以做什么"这个问题,答案经常以"-able"结尾。通过混入类,可以向类中添加功能而不需要保证完全的"是一个"关系。您可以把它当作一种分享(share-with)关系。

    回到动物园示例,您可能想引入某些动物是可以"做宠物"这一概念。也就是说,有些动物可能不需要训练就可以作为动物园游客的宠物。您可能想让所有可以做宠物的动物支持"做宠物"行为。由于可以做宠物的动物没有其他的共性,因此您不想破坏已经设计好的层次结构,Pettable就是很好的混入类。

    混入类经常在用户界面中使用。您可以说Image能够点击,而不需要说PictureButton类既是Image又是Button。您桌面上的文件夹图标可以是一个可以拖动的Image。软件开发人员总是喜欢弄一大堆有趣的形容词。

    当考虑类的差异而不是代码的差异时,混入类以及超类的区别还有很多。因为范围有限,混入类通常比多重层次结构容易理解。Pettable混入类只是在已有类中添加了一个行为,Clickable混入类或许仅仅添加了"按下鼠标"以及"抬起鼠标"行为。此外,混入类很少会有庞大的层次结构,因此不会出现功能的交叉混乱。

    重读《设计模式》之学习笔记(一)--混入类

     作者在1.6.4提到了混入类,可是对它的描述却非常简单:混入类是给其他类提供可选择的接口或功能的类。它与抽象类一样不能实例化。混入类要求多继承。并给了一个如下的类图:

    我觉得,混入类主要用在不同的类有部分相同的接口的时候。使用混入类不仅可以提高代码的重用性,还可以使相关的操作集中在一个类中而不是分散在各个类中,提高了代码的可维护性。
       现在用一个简单的例子来说明混入类在代码可重用性方面的优点。
       比如现在有一个个人财务处理系统,要对一个人每个月的收入和支出进行统计整理并以报表形式体现出来。我们可以分别给收入和支出写两个抽象类CIncome和CExpenditure。当然我们可以给这两个类分别添加一个CreateReport()的方法来生成各自的报表。类图如下:

     这样的话,我们就得分别给这两个类都添加一个几乎一摸一样的CreateReport()方法的代码。但是,一旦我们报表的生成方法有改动,我们就必分别须去修改类CIncome和类CExpenditure中的CreateReport()方法的代码;如果我们又为该系统增加了自动发送报表的功能的话,我们不得不分别给类CIncome和类CExpenditure添加一个SendReport()的方法。这样做,不但浪费时间而且使代码的可维护性降低。在这个时候我们就可以添加一个混入类CReport。类图如下:

    采用新的继承体系后,对报表的实现功能有任何改动或者增添什么功能,都不必修改类CIncome和类CExpenditure。使用混入类提高了代码的重用性和可维护性。(王朝网络 wangchao.net.cn)

    缘起:《设计模式》P148

    re-mix in CodePlex
        http://remix.codeplex.com/

        https://www.re-motion.org/blogs/mix/category/mixins
        https://www.re-motion.org/blogs/team/category/mixins
     
    Relative subject:
        http://en.wikipedia.org/wiki/Extension_method
        http://en.wikipedia.org/wiki/Marker_interface
        Implementing Mixins with C# Extension Methods
        http://www.zorched.net/2008/01/03/implementing-mixins-with-c-extension-methods/

    js掺合模式(Mixin)

  • 相关阅读:
    历经7年双11实战,阿里巴巴是如何定义云原生混部调度优先级及服务质量的?
    阿里园区的这个“格子间” 成为企业高效协同新利器
    神马是代码简单的cmd模式,这就是!
    什么是javascript的中间件?
    centos 修改主机名
    centos6.5 ssh免密码登陆
    mysql 镜像
    Spring Boot 负载均衡之外置session状态保存
    解决shiro和quartz2 版本冲突问题
    centos6.5 修改java环境变量
  • 原文地址:https://www.cnblogs.com/youxin/p/3623329.html
Copyright © 2011-2022 走看看