设计模式课程 设计模式精讲 3-11 合成复用原则coding
1 课堂概念
1.0 继承关系的选择
1.1 起名
1.2 定义
1.3 组合聚合优缺点
1.4 继承优缺点
1.5 组合聚合区别
2 代码演练
2.1 反例
2.2 正例
3 疑问解答
3.1 疑问解答
1 课堂概念
1.0 继承关系的选择(自己理解)
搜索,官方解答,说继承关系是is a的关系,在我看来,正方形is a 长方形,详看3.1解答和上节的案例。
所以看是否有继承关系,通常要看子类和父类共用的方法,子类是否能够实现实现父类的方法。(自己理解)
1.1 起名
合成复用原则,组合复用原则,聚合复用原则
1.2 定义
尽量使用组合,聚合,而不是继承关系达到复用软件的目的。
1.3 组合聚合(黑箱复用)
优点:降低耦合,提高系统的灵活性。使一个类的变化对其他类造成的影响较小。
缺点:会生成较多的对象进行管理。
1.4 继承(白箱复用)
优点:新的扩展性容易实现,修改和扩展相对容易。
缺点:父类的方法侵入性的带给子类,父类方法的改变,子类也必须改变,相比耦合较高。
1.5 组合聚合区别
关系强弱,组合强,聚合弱。
2 代码演练
2.1 反例
类关系:

测试类:
package com.geely.design.principle.compositionaggregation;
public class TestBizDao {
public static void main(String [] args){
BizDaoNegative bizDaoNegative = new BizDaoNegative();
bizDaoNegative.getDBConnection();
}
// public static void main(String [] args){
// BizDao bizDao = new BizDao();
//// DBConnection dbConnection = new MySqlConnection();
//// bizDao.setDbConnection(dbConnection);
// DBConnection dbConnection = new OracleConnection();
// bizDao.setDbConnection(dbConnection);
// bizDao.handleBiz();
// }
}
dao类:
package com.geely.design.principle.compositionaggregation;
public class BizDaoNegative extends DBConnectionNegative{
@Override
public void getDBConnection() {
super.getDBConnection();
}
}
获取连接类:
package com.geely.design.principle.compositionaggregation;
public class DBConnectionNegative {
public void getDBConnection(){
System.out.println("打开MySql连接");
}
}
打印结果:
"C:\Program Files\Java\jdk1.6.0_43\bin\java.exe" "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=9805:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.6.0_43\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\jce.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\resources.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\out\production\design_pattern" com.geely.design.principle.compositionaggregation.TestBizDao
打开MySql连接 Process finished with exit code 0
2.2 正例
类图:

测试类:
package com.geely.design.principle.compositionaggregation;
public class TestBizDao {
// public static void main(String [] args){
// BizDaoNegative bizDaoNegative = new BizDaoNegative();
// bizDaoNegative.getDBConnection();
// }
public static void main(String [] args){
BizDao bizDao = new BizDao();
DBConnection dbConnection = new MySqlConnection();
// bizDao.setDbConnection(dbConnection);
// DBConnection dbConnection = new OracleConnection();
bizDao.setDbConnection(dbConnection);
bizDao.handleBiz();
}
}
dao类:
package com.geely.design.principle.compositionaggregation;
public class BizDao {
private DBConnection dbConnection;
public void setDbConnection(DBConnection dbConnection) {
this.dbConnection = dbConnection;
}
public void handleBiz(){
dbConnection.getConnection();
}
}
获取连接抽象类:
package com.geely.design.principle.compositionaggregation;
public abstract class DBConnection {
public abstract void getConnection();
}
获取Mysql连接类:
package com.geely.design.principle.compositionaggregation;
public class MySqlConnection extends DBConnection{
@Override
public void getConnection() {
System.out.println("打开MySql连接");
}
}
获取Oracle连接类:
package com.geely.design.principle.compositionaggregation;
public class OracleConnection extends DBConnection{
@Override
public void getConnection() {
System.out.println("打开oracle连接");
}
}
打印结果
"C:\Program Files\Java\jdk1.6.0_43\bin\java.exe" "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=12553:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.6.0_43\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\jce.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\resources.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\out\production\design_pattern" com.geely.design.principle.compositionaggregation.TestBizDao
打开MySql连接 Process finished with exit code 0
3 疑问解答
3.1 疑问解答

设计模式课程 设计模式精讲 3-11 合成复用原则coding的更多相关文章
- 设计模式 第一天 UML图,设计模式原则:开闭原则、依赖倒转原则、接口隔离原则、合成复用原则、迪米特法则,简单工厂模式
1 课程大纲 2 UML的概述 总结: UML unified model language 统一建模语言 一共有十种图: 类图 用例图 时序图 * 对象图 包图 组件图 部署图 协作图 状态图 (最 ...
- Java设计模式(4:里氏替换原则和合成复用原则详解
一.里氏替换原则 如果说实现开闭原则的关键步骤就是抽象化,那么基类(父类)和子类的继承关系就是抽象化的具体实现,所以里氏替换原则就是对实现抽象化的具体步骤的规范.即:子类可以扩展基类(父类)的功能,但 ...
- 融会贯通——最常用的“合成复用原则”技能点Get
复用一个类的时候,多使用对象的组合/聚合的关联关系,而不是继承. 之前提到的"依赖倒转原则",是以里氏代换原则为基础的实现开闭原则目标的手段,这一条路线涉及到的是类的继承(包括单继 ...
- 面象对象设计原则之七:合成复用原则(Composition/Aggregate Reuse Principle, CARP)
合成复用原则又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle, CARP),其定义如下: 合成复用原则(Composite Reuse Princi ...
- DesignPattern系列__07合成复用原则
基本介绍 合成复用原则的核心,就是尽量去使用组合.聚合等方式,而不是使用继承. 核心思想 1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起. 2.针对接口编程,而不是 ...
- 设计模式课程 设计模式精讲 7-2 建造者模式Coding
1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...
- 设计模式课程 设计模式精讲 17-2 模板方法模式coding
1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...
- 设计模式课程 设计模式精讲 3-3 开闭原则 coding
1 课程讲解 1.1 开闭原则定义 1.2 不重要内容 2 代码coding 2.1 基类 2.2 需求:打印出原价和折扣后的价格.(接口不应该随意变化,面向接口编程) 1 课程讲解 1.1 开闭原则 ...
- 设计模式课程 设计模式精讲 6-2 抽象工厂coding
1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工 ...
随机推荐
- Codeforces Round #599 (Div. 2) B1. Character Swap (Easy Version)
This problem is different from the hard version. In this version Ujan makes exactly one exchange. Yo ...
- 主席树板子 p2104
#include<cstdio> #include<algorithm> #include<vector> using namespace std; ; int n ...
- 【 SSH 整合】Spring、Struts、Hibernate基本整合
applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...
- 使用Quartz Job 简单的做一个定时服务
第一步:创建一个windows服务 第二步:通过NuGet 安装Quartz (我搜索了Quartz 关键字 安装了 ) 第三步 代码部分 任务类 如 多个任务 就多几个类 public class ...
- ALSA driver--HW Buffer
当app在调用snd_pcm_writei时,alsa core将app传来的数据搬到HW buffer(即DMA buffer)中,alsa driver从HW buffer中读取数据传输到硬件播放 ...
- 【Webpack】
目录 关于模块化编程 Webpack的工作方式 三个重要的概念 使用Webpack创建一个项目 正式使用Webpack 使用Webpack进行ES6的模块化编程 "本质上,Webpack是一 ...
- 将项目打成war包并用tomcat部署的方法,步骤及注意点
部署的遇到第一个问题,就是tomcat和jdk的环境问题: 首先 理解为啥要关注这二者的环境呢?他们还是有关系的–tomcat 作为比较流行的java Web服务器也是用java来实现的一个比较大的软 ...
- 《gPRC使用protobuf构建微服务》阅读笔记
首先我需要去了解一些概念,根据百度百科了解到: l 微服务架构:微服务架构是一项在云中部署应用和服务的新技术.微服务可以在“自己的程序”中运行,并通过“轻量级设备与HTTP型API进行沟通”. l ...
- 南京邮电大学网络攻防平台(NCTF)-MD5-Writeup
南京邮电大学网络攻防平台-MD5-Writeup 题干如下: 分析: 遍历 TASC?O3RJMV?WDJKX?ZM(?替换为其他),找到md5为e9032???da???08????911513?0 ...
- boolean类型set、get方法
今天在了解lombok的时候偶然看到一个问题,在bean中存在boolean类型的数据的时候,用eclipse工具自动生成的set.get方法存在的问题. 不管变量为isXXX还是XXX时,set.g ...