设计模式课程 设计模式精讲 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 抽象工 ...
随机推荐
- 引用opencv静态库的makefile写法
参考博客:https://blog.csdn.net/baidu_31872269/article/details/91985846 参考博客:https://blog.csdn.net/Felaim ...
- 项目出现红色感叹号, pom.xml并出错
问题描述: eclipse出现红色感叹号,pom.xml 文件也报错 但没有提示具体是那里出错了. 打开 Java Build Path 找到 Librarices 你在看到 Maven Dep ...
- PHPStorm设置Ctrl+滚轮调整字体大小
1.点击左上角的File,再点击setting: 2.Editor->General,选择Change font size (Zoom) with Ctrl+Mouse Wheel: 3.点击O ...
- java中的main方法参数String[] args的说明
参数String[] args 的作用是在运行main方法时,在控制台输入参数 class Test{ public static void main(String[] args){ for(Stri ...
- Java的Path、Paths和Files
前言 因为这几天被java.nio的这几个接口和工具类卡到了,就顺便地查了一波文档以及使用方法,这篇其实更像是API的复制粘贴,只不过我在注释里多写了一些output和注意事项,看不惯API的可以选择 ...
- 201771010135 杨蓉庆《面对对象程序设计(java)》第十八周学习总结
1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设计结构: (4) 综合掌握java多线程编程模型: ...
- spring与jdbc,mybatis的结合
关键点在于把DataSource(数据源)配置到spring容器中,通过数据源获取数据库连接对象 数据库连接池(pool):管理数据库连接对象 四种数据源: 1)<!-- 基于jdk的规范数据源 ...
- 《深入理解Java虚拟机》读书笔记四
第五章 调优案例分析与实战
- vue动态生成组件
单个组件引用,引入此文件js.全局使用,注册到vue的main文件Vue.prototype.create = Create create.js import Vue from 'vue';impor ...
- JavaScript和jQuery中的方法整理
一.属性操作 // JavaScript: Dom.hasAttribute('attrName'); //是否有指定属性 Dom.hasAttributes(); //是否有属性 Dom.getAt ...