03设计模式六大原则PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10
二、单一职责原则(SRP)
• (1)目的:如果你有多个原因去改变一个类,那么应该 把这些引起变化的原因分离开,把这个类分成多个类, 每个类只负责处理一种改变。当你做出某种改变时,只 需要修改负责处理该改变的类。
• (2)单一职责原则 – 一个类应该只受一种变化的影响。 – 如果一个类承担的职责过多,就等于把这些职责耦 合在一起,一个职责的变化可能会削弱或者抑制这 个类完成其他职责的能力。这种耦合会导致脆弱的 设计,当变化发生时,设计会遭到意想不到的破坏。
• (2)接口隔离原则
• 接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接口,应 该把胖接口中的方法分组,然后用多个接口代替它,每个接口服务于一个 子模块。
客户端不应该依赖它不需要的接口
15
实力分析
7
实例分析
• 先不论程序的健壮性,如果客户要求增加求余运 算,该如何处理?
增加判断,增加分支…
客户类
8
改进后
客户类
……
9
开闭原则小结
– 开闭原则适用于那些需求会经常发生变化 的系统,应该努力使大部分模块满足开闭 原则。开闭原则是面向对象设计的核心, 满足该原则可以达到最大限度的复用和可 维护性。
如果应用程序 变化影响连接 方法,那么就
需要重构
13
单一职责原则小结
• 优点:消除耦合,减小因需求变化引起代码僵化性臭味 • 使用SRP注意点:
• 1、一个合理的类,应该仅有一个引起它变化的原因,即单一职责; • 2、在没有变化征兆的情况下应用SRP或其他原则是不明智的; • 3、在需求实际发生变化时就应该应用SRP等原则来重构代码; • 4、使用测试驱动开发会迫使我们在设计出现臭味之前分离不合理
北风网项目培训
设计模式——面向对象基础
整体 概述
一 请在这里输入您的主要叙述内容
二
请在这里输入您的主要 叙述内容
三 请在这里输入您的主要叙述内容
2
本章目标
• 开-闭原则 • 单一职责原则 • 接口隔离原则 • 里氏代换原则 • 依赖倒转原则 • 组合优先于继承
3
面向对象诊所
• 系统僵化,不可修改或者扩展(修改难或扩展 难)。
对扩展开放,对修改关闭。
• 对扩展开放:有新的需求或变化时,可以对现有 代码进行扩展,以适应新情况。
• 对修改关闭:类一旦设计完成,就可以独立完成 自己的工作,而不要再对类进行任何修改。
• 实现方式:抽象,多态,继承,接口
6
实例分析
Console.Write("请输入数字A:"); string A = Console.ReadLine(); Console.Write("请选择运算符号(+、-、*、/):"); sCtorinnsgoBle.=WCrioten(s"o请le输.R入ea数要d字L加inB运e:算()";,); 怎么办? string C = Console.ReadLine(); string D = ""; if (B == "+")
代码; • 5、如果测试不能迫使职责分离,僵化性和脆弱性的臭味会变得很
强烈,那就应该用Facade或Proxy模式对代码重构;
14
三、接口隔离原则(ISP)
• (1)目的:当我们设计应用程序的时候,如果一个模块包含
多个子模块,那么我们应该小心对该模块做出抽象。设想该模块由 一个类实现,我们可以把系统抽象成一个接口。但是当我们想要添 加一个新的模块扩展程序时,如果要添加的模块只包含原系统中的 一些子模块,那么就会强迫我们实现接口中的所有方法,并且还要 编写一些哑方法。这样的接口被称为胖接口或者叫被污染的接口。
D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C)); if (B == "/")
D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C)); Console.WriteLine("结果是:" + D);
• 过分复杂或者重复代码多,往往看代码的时候不 知道从哪里看起,也不知道程序会跑到哪里去。
• 不可复用,公共部分剥离不出来只能到处拷贝。 • 不够稳定,经常出错-改-出错-改….. • 系统运行不可靠,连自己也不敢相信自己的系统
4
原则的诞生
• 面向对象:封装、继承、多态三大支柱蕴含了用 抽象来封装变化,降低耦合,实现复用的精髓。
interface DataChannel {
public void send(char c); public void recv(); } interface Connection { public void dial(string pno); public void hangup(); }
modem接 口明显具有 两个职责: 连接管理和 数据通讯
• 封装:隐藏内部实现,保护内部信息 • 继承:实现复用,归纳共性 • 多态:改写对象行为,实现更高级别的继承
• 要实现这些目的,就必须遵守一些原则:封装变 化、对接口编程、少继承多聚合……
• 实现系统的可扩展、可复用、灵活性好、维护性 好
5
一、开-闭原则(OCP)
• 核心思想:
软件Байду номын сангаас该是可扩展,而不可修改的。
一个类,应该仅有一个引起它变化的原因
11
单一职责原则(SRP)
• (3)好处: – ① 类的复杂性降低,实现什么职责都有清 晰明确的定义。 – ② 可读性提高。 – ③ 可维护性提高。 – ④ 变更引起的风险降低。
12
实例
interface Modem {
public void dial(string pno); public void hangup(); public void send(char c); public void recv(); }
D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C)); if (B == "-")
D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C)); if (B == "*")
二、单一职责原则(SRP)
• (1)目的:如果你有多个原因去改变一个类,那么应该 把这些引起变化的原因分离开,把这个类分成多个类, 每个类只负责处理一种改变。当你做出某种改变时,只 需要修改负责处理该改变的类。
• (2)单一职责原则 – 一个类应该只受一种变化的影响。 – 如果一个类承担的职责过多,就等于把这些职责耦 合在一起,一个职责的变化可能会削弱或者抑制这 个类完成其他职责的能力。这种耦合会导致脆弱的 设计,当变化发生时,设计会遭到意想不到的破坏。
• (2)接口隔离原则
• 接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接口,应 该把胖接口中的方法分组,然后用多个接口代替它,每个接口服务于一个 子模块。
客户端不应该依赖它不需要的接口
15
实力分析
7
实例分析
• 先不论程序的健壮性,如果客户要求增加求余运 算,该如何处理?
增加判断,增加分支…
客户类
8
改进后
客户类
……
9
开闭原则小结
– 开闭原则适用于那些需求会经常发生变化 的系统,应该努力使大部分模块满足开闭 原则。开闭原则是面向对象设计的核心, 满足该原则可以达到最大限度的复用和可 维护性。
如果应用程序 变化影响连接 方法,那么就
需要重构
13
单一职责原则小结
• 优点:消除耦合,减小因需求变化引起代码僵化性臭味 • 使用SRP注意点:
• 1、一个合理的类,应该仅有一个引起它变化的原因,即单一职责; • 2、在没有变化征兆的情况下应用SRP或其他原则是不明智的; • 3、在需求实际发生变化时就应该应用SRP等原则来重构代码; • 4、使用测试驱动开发会迫使我们在设计出现臭味之前分离不合理
北风网项目培训
设计模式——面向对象基础
整体 概述
一 请在这里输入您的主要叙述内容
二
请在这里输入您的主要 叙述内容
三 请在这里输入您的主要叙述内容
2
本章目标
• 开-闭原则 • 单一职责原则 • 接口隔离原则 • 里氏代换原则 • 依赖倒转原则 • 组合优先于继承
3
面向对象诊所
• 系统僵化,不可修改或者扩展(修改难或扩展 难)。
对扩展开放,对修改关闭。
• 对扩展开放:有新的需求或变化时,可以对现有 代码进行扩展,以适应新情况。
• 对修改关闭:类一旦设计完成,就可以独立完成 自己的工作,而不要再对类进行任何修改。
• 实现方式:抽象,多态,继承,接口
6
实例分析
Console.Write("请输入数字A:"); string A = Console.ReadLine(); Console.Write("请选择运算符号(+、-、*、/):"); sCtorinnsgoBle.=WCrioten(s"o请le输.R入ea数要d字L加inB运e:算()";,); 怎么办? string C = Console.ReadLine(); string D = ""; if (B == "+")
代码; • 5、如果测试不能迫使职责分离,僵化性和脆弱性的臭味会变得很
强烈,那就应该用Facade或Proxy模式对代码重构;
14
三、接口隔离原则(ISP)
• (1)目的:当我们设计应用程序的时候,如果一个模块包含
多个子模块,那么我们应该小心对该模块做出抽象。设想该模块由 一个类实现,我们可以把系统抽象成一个接口。但是当我们想要添 加一个新的模块扩展程序时,如果要添加的模块只包含原系统中的 一些子模块,那么就会强迫我们实现接口中的所有方法,并且还要 编写一些哑方法。这样的接口被称为胖接口或者叫被污染的接口。
D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C)); if (B == "/")
D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C)); Console.WriteLine("结果是:" + D);
• 过分复杂或者重复代码多,往往看代码的时候不 知道从哪里看起,也不知道程序会跑到哪里去。
• 不可复用,公共部分剥离不出来只能到处拷贝。 • 不够稳定,经常出错-改-出错-改….. • 系统运行不可靠,连自己也不敢相信自己的系统
4
原则的诞生
• 面向对象:封装、继承、多态三大支柱蕴含了用 抽象来封装变化,降低耦合,实现复用的精髓。
interface DataChannel {
public void send(char c); public void recv(); } interface Connection { public void dial(string pno); public void hangup(); }
modem接 口明显具有 两个职责: 连接管理和 数据通讯
• 封装:隐藏内部实现,保护内部信息 • 继承:实现复用,归纳共性 • 多态:改写对象行为,实现更高级别的继承
• 要实现这些目的,就必须遵守一些原则:封装变 化、对接口编程、少继承多聚合……
• 实现系统的可扩展、可复用、灵活性好、维护性 好
5
一、开-闭原则(OCP)
• 核心思想:
软件Байду номын сангаас该是可扩展,而不可修改的。
一个类,应该仅有一个引起它变化的原因
11
单一职责原则(SRP)
• (3)好处: – ① 类的复杂性降低,实现什么职责都有清 晰明确的定义。 – ② 可读性提高。 – ③ 可维护性提高。 – ④ 变更引起的风险降低。
12
实例
interface Modem {
public void dial(string pno); public void hangup(); public void send(char c); public void recv(); }
D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C)); if (B == "-")
D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C)); if (B == "*")