面向对象设计原则之6-合成复用原则
合成复用原则(Composite Reuse Principle or CRP)
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/349 访问。
尽量使用对象组合,而不是继承来达到复用的目的。
CRP:Favor polymorphic composition of objects over inheritance as a reuse mechanism.
合成复用原则是鼓励优先使用对象的组合,而不是使用继承。
示例:
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()}!");}}
//建设银行普通银行卡
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类型的参数,显然不符合里氏替换原则。以下给出一个解决方案以供参考:
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,提供用户名、余额等基本功能。
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接口。
//建设银行普通银行卡
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银行卡接口。
//建设银行龙卡信用卡
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信用卡接口。
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/349 访问。
经过以上的代码改造之后,银行卡基类BankCardBase只包含银行卡的基本功能,银行卡接口ICard只包含银行卡相关的业务操作,而信用卡接口ICreditCard则只包含与信用卡相关的业务操作,相互之间没有影响,修改普通银行卡或信用卡的功能,不会影响到其它类型的银行卡的业务逻辑,符合开闭原则。
转账方法使用基类参数BankCardBase,运用在“运行时子类对象替代父类对象”的特点,使得代码的可扩展性极高,符合里氏替换原则。在这个示例中,我们优先使用各种类和接口的组合来代替之前的单一基类的继承关系来打造普通银行卡和信用卡的功能,使得整个设计更干净利落,可维护性高,并且这些类和接口还可以被无限合理的复用,这就是合成复用原则。
面向对象设计原则之6-合成复用原则相关推荐
- 【设计模式】设计原则:CARP 合成复用原则
合成复用原则(Composite/Aggregate Reuse Principle,CARP)是指尽量使用对象组合(has-a)/聚合(contanis-a),而不是继承关系达到软件复用的目的.可以 ...
- 设计模式-合成复用原则-》面向对象设计原则
合成复用原则是面向对象设计原则的 7 条原则中剩下的最后一条,下面我们将对其进行详细地介绍. 合成复用原则的定义 合成复用原则(Composite Reuse Principle,CRP)又叫组合/聚 ...
- 软件设计原则之接口隔离原则、合成复用原则、迪米特原则
系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.接口隔离原则 什么是接口 ...
- Java设计模式之设计的6大原则(开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,最少知道原则,合成复用原则)
1. 开闭原则 核心思想:一个对象对外扩展开发,对修改关闭 意思就是:对类的改动是通过增加代码进行的,而不是修改现有的代码. 也就是说软件开发人员一旦写出了可以运行的代码,就不应该去改动它,而是要保证 ...
- 4.7 合成复用原则
一. 合成复用原则的定义 合成复用原则(Composite Reuse Principle,CRP)又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle, ...
- 面向对象软件设计原则【JAVA】(开闭原则、里氏代换、依赖倒转、接口隔离、迪米特法则、合成复用原则)
软件设计原则[JAVA](开闭原则.里氏代换.依赖倒转.接口隔离.迪米特法则.合成复用原则) 1.开闭原则 2.里氏代换原则 3.依赖倒转原则 4.接口隔离原则 5.迪米特法则 6.合成复用原则 1. ...
- 面向对象设计原则之合成复用原则
合成复用原则又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle, CARP),其定义如下: 合成复用原则(Composite Reuse Princi ...
- 融会贯通——最常用的面向对象设计原则“合成复用原则”
复用一个类的时候,多使用对象的组合/聚合的关联关系,而不是继承. 之前提到的"依赖倒转原则",是以里氏代换原则为基础的实现开闭原则目标的手段,这一条路线涉及到的是类的继承(包括单继 ...
- 面向对象编程原则(08)——合成复用原则
版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 参考资料 <大话设计模式> 作者:程杰 <Java设计模式> 作者:刘 ...
最新文章
- 查阅arXiv论文新神器,一行代码比较版本差别,Github新开源!
- Java 程序中使用 MongoDB教程
- 深度学习修炼(三)——自动求导机制
- 漫步线性代数二十三——行列式公式
- Hadoop生态圈-zookeeper本地搭建以及常用命令介绍
- 特斯拉上海超级工厂Model Y日产量达到1000辆 超过Model 3
- Windows系统下SSH客户端连接阿里云Linux服务器
- amcharts去除版权标志
- 隐马尔可夫HMM(EM算法(期望最大化算法)
- Python 二次开发 AutoCAD 简介
- win7 蓝牙4.0 ble驱动_Android FrameWorkamp;HAL视频最新进度: 蓝牙更新6节(更新时间2019年3月27日)...
- python--查询PG数据库
- 计算机里pc是什么,什么是pc?pc是什么意思?
- isSelected() 的使用
- oracle dbms_utility,dbms_utility的两个有用方法
- 使用maven-sql-plugin实现持续数据库集成(CDBI) [ 光影人像 东海陈光剑 的博客 ]
- RabbitMQ实现订单超时设计思路、以及在订单过期临界点支付成功如何处理
- 移动端html网页真机调试,Mac端调试iphone移动端网页
- Tief Meer alt singen nennen Papa.Magnam natus consequuntur corporis laudantium.
- Project为项目设置预算