首页
学习
活动
专区
圈层
工具
发布
40 篇文章
1
【愚公系列】2023年11月 二十三种设计模式(零)-简单工厂模式(Simple Factory Pattern)
2
【愚公系列】2023年11月 二十三种设计模式(一)-工厂方法模式(Factory Method Pattern)
3
【愚公系列】2023年11月 二十三种设计模式(二)-抽象工厂模式(Abstract Factory Pattern)
4
【愚公系列】2023年11月 二十三种设计模式(三)-建造者模式(Builder Pattern)
5
【愚公系列】2023年11月 二十三种设计模式(四)-原型模式(Prototype Pattern)
6
【愚公系列】2023年11月 二十三种设计模式(五)-单例模式(Singleton Pattern)
7
【愚公系列】2023年11月 二十三种设计模式(六)-适配器模式(Adapter Pattern)
8
【愚公系列】2023年11月 二十三种设计模式(七)-桥接模式(Bridge Pattern)
9
【愚公系列】2023年11月 二十三种设计模式(八)-组合模式(Composite Pattern)
10
【愚公系列】2023年11月 二十三种设计模式(九)-装饰者模式(Decorator Pattern)
11
【愚公系列】2023年11月 二十三种设计模式(十)-外观模式(Facade Pattern)
12
【愚公系列】2023年11月 二十三种设计模式(十一)-享元模式(Flyweight Pattern)
13
【愚公系列】2023年11月 二十三种设计模式(十二)-代理模式(Proxy Pattern)
14
【愚公系列】2023年11月 二十三种设计模式(十三)-职责链模式(Chain of Responsibility Pattern)
15
【愚公系列】2023年11月 二十三种设计模式(十四)-命令模式(Command Pattern)
16
【愚公系列】2023年11月 二十三种设计模式(十五)-解释器模式(Interpreter Pattern)
17
【愚公系列】2023年11月 二十三种设计模式(十六)-迭代器模式(Iterator Pattern)
18
【愚公系列】2023年11月 二十三种设计模式(十七)-中介者模式(Mediator Pattern)
19
【愚公系列】2023年11月 二十三种设计模式(十八)-备忘录模式(Memento Pattern)
20
【愚公系列】2023年11月 二十三种设计模式(十九)-观察者模式(Observer Pattern)
21
【愚公系列】2023年11月 二十三种设计模式(二十)-状态模式(State Pattern)
22
【愚公系列】2023年11月 二十三种设计模式(二十一)-策略模式(Stragety Pattern)
23
【愚公系列】2023年11月 二十三种设计模式(二十二)-模板方法模式(Template Method Pattern)
24
【愚公系列】2023年11月 二十三种设计模式(二十三)-访问者模式(Vistor Pattern)
25
【愚公系列】2023年11月 面向对象设计原则(一)-单一职责原则(Single Responsibility Principle or SRP)
26
【愚公系列】2023年10月 面向对象设计原则(二)-开放闭合原则(Open-Closed Principle or OCP)
27
【愚公系列】2023年11月 面向对象设计原则(三)-里氏替换原则(Liskov Substitution Principle or LSP)
28
【愚公系列】2023年11月 面向对象设计原则(四)-依赖倒置原则(Dependence Inversion Principle DIP)
29
【愚公系列】2023年11月 面向对象设计原则(五)-接口隔离原则(Interface Segregation Principle or ISP)
30
【愚公系列】2023年11月 面向对象设计原则(六)-合成复用原则(Composite Reuse Principle or CRP)
31
【愚公系列】2023年11月 面向对象设计原则(七)-迪米特法则(Law of Demeter or LoD)
32
【愚公系列】2023年11月 通用职责分配原则(一)-信息专家原则(Information Expert Principle)
33
【愚公系列】2023年11月 通用职责分配原则(二)-创造者原则(Creator Principle)
34
【愚公系列】2023年11月 通用职责分配原则(三)-低耦合原则(Low Coupling Principle)
35
【愚公系列】2023年11月 通用职责分配原则(四)-高内聚原则(High Cohesion Principle)
36
【愚公系列】2023年11月 通用职责分配原则(五)-控制器原则(Controller Principle)
37
【愚公系列】2023年11月 通用职责分配原则(六)-多态原则(Polymorphism Principle)
38
【愚公系列】2023年11月 通用职责分配原则(七)-纯虚构原则(Pure Fabrication Principle)
39
【愚公系列】2023年11月 通用职责分配原则(八)-中介原则(Indirection Principle)
40
【愚公系列】2023年11月 通用职责分配原则(九)-受保护变量原则(Protected Variations Principle)

【愚公系列】2023年11月 面向对象设计原则(六)-合成复用原则(Composite Reuse Principle or CRP)

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。

🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。

🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

面向对象设计原则是一些通用的软件设计原则,用于指导软件设计人员开发高质量、可扩展、可维护的软件系统。这些原则的作用如下:

  1. 提高软件系统的可维护性:遵循面向对象设计原则可以将代码分解为更小、更专注的模块,从而降低代码的复杂性和耦合度,提高系统的可读性和可维护性。
  2. 提高软件系统的可扩展性:开放封闭原则可以帮助软件系统更容易地适应变化,降低对现有代码的影响,从而提高软件系统的可扩展性和灵活性。
  3. 提高软件系统的重用性:接口隔离原则可以将接口分解为更小、更专注的部分,提高代码的可读性和可复用性,从而提高软件系统的重用性。
  4. 提高软件质量:通过遵循面向对象设计原则,软件设计人员可以避免一些常见的设计错误,从而提高软件系统的质量和可靠性。

遵循面向对象设计原则可以帮助软件设计人员开发高质量、可扩展、可维护和重用的软件系统。

🚀一、合成复用原则(Composite Reuse Principle or CRP)

合成复用原则,也称为CRP,是一种面向对象设计原则,它建议通过将现有对象和组件组合成新的对象来复用现有代码,而不是通过继承现有代码来扩展功能。它的基本思想是将复用和灵活性作为设计的主要目标,使设计更加可扩展和可维护。通过这种方式,可以减少代码重复,降低开发成本,并使系统更具弹性。 CRP的核心理念是“尽量使用组合,尽量少使用继承”。这意味着代码应该尽可能地使用对象组合来实现复用,而不是子类化。

🚀二、使用步骤

🔎1.示例

代码语言:c#
复制
public abstract class BankCard {

    public string UserName { get; set; }//用户名
    public string Balance { get; set; }//余额

    public abstract void Transfer(BankCard card, double amount);//转账
    public abstract void Withdraw(double amount);//取款
    public abstract void Deposit(double amount);//存款
    public abstract void Overdraft(double amount);//透支

    public virtual void ShowMessage() {
        Console.WriteLine($"THis is {this.ToString()}!"); 
    }

}
代码语言:c#
复制
//建设银行普通银行卡
public class CCBCard : BankCard {

    public override void Deposit(double amount) {
        Console.WriteLine("Deposit");
    }

    public override void Overdraft(double amount) {
        throw new NotImplementedException();
    }

    public override void Transfer(BankCard card, double amount) {
        Console.WriteLine("Transfer");
    }

    public override void Withdraw(double amount) {
        Console.WriteLine("Withdraw");
    }

}

以上这种设计将银行卡的大部分功能封装在抽象基类BankCard中,建设银行普通银行卡类CCBCard类继承这个基类,但是建行的普通银行卡显然没有透支功能,导致导致不得不为这个没有透支功能的银行卡添加一个默认的透支实现,这显然是不合理的。另外如果修改基类中任何一个功能,所有继承自BankCard的类可能都要重写,这显然也不符合开闭原则。转账方法使用BankCard类型的参数,显然不符合里氏替换原则。以下给出一个解决方案以供参考:

代码语言:c#
复制
public abstract class BankCardBase {

    public string UserName { get; set; }//用户名
    public string Balance { get; set; }//余额

    public virtual void ShowMessage() {
        Console.WriteLine($"THis is {this.ToString()}!");     
    }

}

独立一个抽象基类BankCardBase,提供用户名、余额等基本功能。

代码语言:c#
复制
public interface ICard {

    void Transfer(BankCardBase card, double amount);//转账
    void Withdraw(double amount);//取款
    void Deposit(double amount);//存款

}

public interface ICreditCard : ICard {

    void Overdraft(double amount);//透支

}

抽象出ICard银行卡基本操作接口,包含转账、取款和存款。ICreditCard信用卡接口,考虑到信用卡一定包含普通银行卡功能,所以继承ICard接口。

代码语言:c#
复制
//建设银行普通银行卡
public class CCBCard : BankCardBase, ICard {

    public void Deposit(double amount) {
        Console.WriteLine("Deposit");
    }

    public void Transfer(BankCardBase card, double amount) {
        Console.WriteLine("Transfer");
    }

    public void Withdraw(double amount) {
        Console.WriteLine("Withdraw");
    }

}

建设银行普通银行卡实体类,继承自银行卡抽象基类并实现ICard银行卡接口。

代码语言:c#
复制
//建设银行龙卡信用卡
public class CCBDragonCard : BankCardBase, ICreditCard {

    public void Deposit(double amount) {
        Console.WriteLine("Deposit");
    }

    public void Overdraft(double amount) {
        Console.WriteLine("Overdraft");
    }

    public void Transfer(BankCardBase card, double amount) {
        Console.WriteLine("Transfer");
    }

    public void Withdraw(double amount) {
        Console.WriteLine("Withdraw");
    }

}

建设银行龙卡信用卡实体类,继承自银行卡抽象基类并实现ICreditCard信用卡接口。

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

🚀总结

经过以上的代码改造之后,银行卡基类BankCardBase只包含银行卡的基本功能,银行卡接口ICard只包含银行卡相关的业务操作,而信用卡接口ICreditCard则只包含与信用卡相关的业务操作,相互之间没有影响,修改普通银行卡或信用卡的功能,不会影响到其它类型的银行卡的业务逻辑,符合开闭原则。

转账方法使用基类参数BankCardBase,运用在“运行时子类对象替代父类对象”的特点,使得代码的可扩展性极高,符合里氏替换原则。在这个示例中,我们优先使用各种类和接口的组合来代替之前的单一基类的继承关系来打造普通银行卡和信用卡的功能,使得整个设计更干净利落,可维护性高,并且这些类和接口还可以被无限合理的复用,这就是合成复用原则。


我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

下一篇
举报
领券