首页 > 其他分享 >必知必会的设计原则——合成复用原则

必知必会的设计原则——合成复用原则

时间:2023-02-14 09:56:46浏览次数:57  
标签:原则 必知 void 复用 public class

 设计原则系列文章 

  1. 必知必会的设计原则——单一职责原则
  2. 必知必会的设计原则——开放封闭原则
  3. 必知必会的设计原则——依赖倒置原则
  4. 必知必会的设计原则——里氏替换原则
  5. 必知必会的设计原则——接口隔离原则
  6. 必知必会的设计原则——迪米特原则
  7. 必知必会的设计原则——合成复用原则

概述

在面向对象设计中,可以通过两种方法在不同的环境中复用已有的设计和实现,即通过组合/ 聚合关系或通过继承,但首先应该考虑使用组合/聚合,组合/聚合可以使系统更加灵活,降低 类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少;其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂 度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继 承复用。

合成复用原则又称为组合/聚合复用原则;尽量使用对象组合,而不是继承来达到复用。

“某种程度上 继承有问题”:破坏了系统的封装性,基类发生了改变,子类的实现也会发生改变;子类如果不需要基类中的方法,那么系统耦合性就开始变高;继承是静态的,不能在程序运行时发生改变;

以上图片展示的关于汽车继承案例问题,这个需求如果增加,可以一直继承下去,系统慢慢...

继承案例代码

    public class A
    {
        public void Methond1()
        {
            Console.WriteLine("我是方法1");
        }
        public void Methond2()
        {
            Console.WriteLine("我是方法2");
        }
        public void B_Methond3()
        {
            Console.WriteLine("我是方法3");
        }
    }
    public class B : A
    {
       
        public void MethondB()
        { 
        }
    }
    public class C : B
    {
        public void MethondC()
        {
        }
    }
    public class D : C
    {
        public void MethondD()
        {
        }
    }

结论:问题是有些方法B类并不需要,然而在A类中实现后,B类都需要继承,这就是问题,导致职责不清晰,越来越臃肿!以后新增需求,像C又继承B...

关于汽车案例的需求改用合成复用原则实现

  public interface IColor
    {
        public string ShowCar();
    }
    public class Green : IColor
    {
        public string ShowCar()
        {
            return "绿色";
        }
    }
    public class Red : IColor
    {
        public string ShowCar()
        {
            return "红色";
        }
    }
    //)——————————————————————————————————————————————————

    public abstract class Car
    {
        public abstract void Run(IColor color);
    }
    public class QyCar : Car
    {
        public override void Run(IColor color)
        {
            Console.WriteLine($"汽油式的{color.ShowCar()}颜色车在行驶");
        }
    }
    public class DdCar : Car
    {
        public override void Run(IColor color)
        {
            Console.WriteLine($"电动式的{color.ShowCar()}颜色车在行驶");
        }
    }

结论:像这个汽车行驶的需求,不管以后又有黑色的、蓝色的汽车,或者加水的汽车之类都做好了扩展,不用再使用继承去解决这个问题。

总结

关于合成复用原则在现实编码过程中,尤其对重构系统特别有用,所有的设计原则系列文章都已经更新完毕,有何疑问,欢迎交流。

标签:原则,必知,void,复用,public,class
From: https://www.cnblogs.com/mhg215/p/17117235.html

相关文章

  • 必知必会的设计原则——迪米特原则
     设计原则系列文章 必知必会的设计原则——接口隔离原则必知必会的设计原则——单一职责原则必知必会的设计原则——开放封闭原则必知必会的设计原则——依赖倒置原......
  • 数据库必知必会:TiDB(7)Placement Driver
    (数据库必知必会:TiDB(7)PlacementDriver)PlacementDriverPD的架构PD集群也是主从结构的,有一个leader,另外的节点是follower。集成了ETCD,其Raft协议保证了数据的一致性。......
  • 数据库必知必会:TiDB(6)TiKV读写与 Coprocessor
    (数据库必知必会:TiDB(6)TiKV读写与Coprocessor)读写与Coprocessor数据写入用户提交写请求,由TiDBServer接收,TiDBServer向PD申请TSO,并获得Region的元数据信息,TiDBServe......
  • 划块原则
    1.从小到大,逐级划分   以图片为例,划块应该从上到下分为三个块后再继续进行划分2.同级元素不能既在一行又在一列上    这种情况时应该先分上下两块再继续......
  • 好客租房67-render-props模式-3演示mouseover的组件的复用
    //导入reactimportReactfrom'react'importReactDOMfrom'react-dom'//导入组件//约定1:类组件必须以大写字母开头//约定2:类组件应该......
  • 数据库必知必会:TiDB(5)TiKV Raft
    (数据库必知必会:TiDB(5)TiKVRaft)Raft角色介绍TiKV中的Region保存了3份数据,其中一份数据是主数据,称为leader,另外两份是follower。Region中的数据是按照key进行排序的。......
  • Redis网络模型,IO多路复用
    IO多路复用无论是阻塞l0还是非阻塞lO,用户应用在一阶段都需要调用recvfrom来获取数据,差别在于无数据时的处理方案:*如果调用recvfrom时,恰好没有数据,阻塞IO会使进程阻塞,非......
  • 数据库必知必会:TiDB(4)TiKV分布式事务
    (数据库必知必会:TiDB(4)TiKV分布式事务)分布式事务存在的问题假设有这样一个事务:begin:updatepersonsetname='Tom'whereid=1;updatepersonsetname='Jack'......
  • 分布式数据库设计——数据一致性设计原则
    摘要数据一致性,因为它是复制一致性和分布式事务的理论基础。在现实世界中,分布式数据库的节点并不总是处于活动状态且相互能够通信的。但是,以上这些故障不应该影响数据库的可......
  • m基于FPGA的半带滤波器verilog设计,对比普通结构以及乘法器复用结构
    1.算法描述        HBF模块由半带滤波器(HBF)和抽取模块组成。该模块的任务是实现2倍抽取进一步降低信号采样速率。由于HBF的冲激响应h(k)除零点外其余偶数点均为零......