设计模式课件概述
合集下载
设计模式ppt
违反LSP的后果:有可能需要修d { public abstract void fly() { I’m flying; } }
public class penguin:bird { public override void fly() { I can’t fly; } }
辅助原则
任何变量都不应该持有一个指向具体类的引用。 任何类都不应该从具体类派生。 任何方法都不应该覆盖它的任何基类中已经实现了的方法。
4.3 设计模式的类型
在设计模式经典著作《GOF95》中,设计 模式从应用的角度被分为三个大的类型
创建型模式(Creational Pattern) 结构型模式(Structural Pattern) 行为型模式(Behavioral Pattern)
是一套被反复使用、多数人知晓的、经过分类编目的、 代码设计经验的总结。使用设计模式是为了可重用代码、 让代码更容易被他人理解、保证代码可靠性。
Developing software is hard Developing reusable software is even harder
4.1 设计模式的概念
4.2.1 开放封闭原则(OCP)
实现的主要原则:抽象,把系统的所有可能的行 为抽象成一个抽象底层 ;同时由于可以从抽象层 导出一个或多个新的具体类可改变系统的行为, 因此对于可变的部分,系统设计对扩展是开放的。 可变性封装原则(Encapsulation of Variation Principle, EVP ):对系统所有可能发生变化的 部分进行评估和分类,每一个可变的因素都单独 进行封装。 开闭原则很难被完全实现,只能在某些模块、某 种程度上、某个限度内符合OCP的要求,OCP具 有理想主义的色彩,是OOD的终极目标。
设计模式概述ppt课件
4
引言
庞大的跨平台图像浏览系统
初始设计方案
Image {abstract}
BMPImage
JPGImage
GIFImage
PNGImage
BMPWindowsImp BMPLinuxImp BMPUnixImp
GIFWindowsImp GIFLinuxImp GIFUnixImp
JPGWindowsImp JPGLinuxImp JPGUnixImp
设计模式概述
1
大纲
引言 设计模式的诞生与发展 设计模式的定义与分类 GoF设计模式简介 设计模式的优点
2
引言
从三个实例说起……
• 实例一: 庞大的跨平台图像 浏览系统 • 实例二: 不够灵活的影院售 票系统 • 实例三: 重用第三方算法库 时面临的问题
3
引言
庞大的跨平台图像浏览系统
• 该系统在将来可能还要根据需要引入新的打折方式。
7
//电影票类
class MovieTicket
{
private double price; //电影票价格
引言 private string type; //电影票类型 …… //计算打折之后的票价
public double Calculate()
10
引言
重用第三方算法库时面临的问题
银行业 务问处题理系统
第三方算法库
• 如何在既不修改现有接口又不需要算法库源代码的基
础客上户端能类够实现第三方算法库的重用是该软件公司开发
人员必须面对的问如题。何兼容?
加密类
DataOperation
11
引言
如何 解决?
12
引言
庞大的跨平台图像浏览系统
初始设计方案
Image {abstract}
BMPImage
JPGImage
GIFImage
PNGImage
BMPWindowsImp BMPLinuxImp BMPUnixImp
GIFWindowsImp GIFLinuxImp GIFUnixImp
JPGWindowsImp JPGLinuxImp JPGUnixImp
设计模式概述
1
大纲
引言 设计模式的诞生与发展 设计模式的定义与分类 GoF设计模式简介 设计模式的优点
2
引言
从三个实例说起……
• 实例一: 庞大的跨平台图像 浏览系统 • 实例二: 不够灵活的影院售 票系统 • 实例三: 重用第三方算法库 时面临的问题
3
引言
庞大的跨平台图像浏览系统
• 该系统在将来可能还要根据需要引入新的打折方式。
7
//电影票类
class MovieTicket
{
private double price; //电影票价格
引言 private string type; //电影票类型 …… //计算打折之后的票价
public double Calculate()
10
引言
重用第三方算法库时面临的问题
银行业 务问处题理系统
第三方算法库
• 如何在既不修改现有接口又不需要算法库源代码的基
础客上户端能类够实现第三方算法库的重用是该软件公司开发
人员必须面对的问如题。何兼容?
加密类
DataOperation
11
引言
如何 解决?
12
设计模式详解ppt课件
7
The Factory Pattern
Factory是最常见的设计模式之一,可帮 助我们组织创建对象的代码,通常用于以 下两种情况: 创建复杂的对象,并进行初始化。 根据不同的环境(输入参数),创建不
同用途的对象。一般这些对象都是实现 了相同的接口或继承于同一基类。
8
Factory模式的JDBC应用
设计模式详解
1
何谓设计模式
在面向对象程序设计(OOP)过程中, 我们经常会遇到很多重复出现的问题,总 结解决这些问题的成功经验和最佳实践便 形成了设计模式(Design Pattern)。
其核心思想是将可重用的解决方案总 结出来,并分门别类。从而指导设计,减 少代码重复和优化体系结构。
2
采用设计模式的益处
28
The Decorator Pattern
Decorator模式为我们提供了一种无需 创建派生类就能改变对象行为的方法。
OracleDataSource负责创建链接,由函数getConnection获取链接
9
Factory模式应用于DAO
XMLDB是XML数据库 访问接口,针对Oracle 和DB2分别提供了实现。 XMLDB_DAOFactory为 类工厂,根据输入的参 数dbtype,创建不同的 XMLDB实现类。
public abstract class Employee { public float getSalary() {...} public String getName() {...} public float getSalaries() {...} public abstract int getTypeCode();
实际上,EJB容器将所有资源(JMS Factory、EJB Home等)的Factory全绑定到了目录服务中,使用这些 Factory的时候都是由目录服务获取,因此目录服务是所有 资源Factory的ngleton Pattern
The Factory Pattern
Factory是最常见的设计模式之一,可帮 助我们组织创建对象的代码,通常用于以 下两种情况: 创建复杂的对象,并进行初始化。 根据不同的环境(输入参数),创建不
同用途的对象。一般这些对象都是实现 了相同的接口或继承于同一基类。
8
Factory模式的JDBC应用
设计模式详解
1
何谓设计模式
在面向对象程序设计(OOP)过程中, 我们经常会遇到很多重复出现的问题,总 结解决这些问题的成功经验和最佳实践便 形成了设计模式(Design Pattern)。
其核心思想是将可重用的解决方案总 结出来,并分门别类。从而指导设计,减 少代码重复和优化体系结构。
2
采用设计模式的益处
28
The Decorator Pattern
Decorator模式为我们提供了一种无需 创建派生类就能改变对象行为的方法。
OracleDataSource负责创建链接,由函数getConnection获取链接
9
Factory模式应用于DAO
XMLDB是XML数据库 访问接口,针对Oracle 和DB2分别提供了实现。 XMLDB_DAOFactory为 类工厂,根据输入的参 数dbtype,创建不同的 XMLDB实现类。
public abstract class Employee { public float getSalary() {...} public String getName() {...} public float getSalaries() {...} public abstract int getTypeCode();
实际上,EJB容器将所有资源(JMS Factory、EJB Home等)的Factory全绑定到了目录服务中,使用这些 Factory的时候都是由目录服务获取,因此目录服务是所有 资源Factory的ngleton Pattern
03-设计模式教学课件
My umbrella is convenient. It sits there waiting for me. It has wheels on it so that I do not have to carry it around. I don't even have to push it because it can propel itself. Sometimes, I will open the top of my umbrella to let in the sun. (Why I am using my umbrella when it is sunny outside is beyond me!)
象 要针对接口编程,不针对实现编程。
修电脑得到的启示
强内聚、松耦合
由于PC易插拨的方式,那么不管哪一个出问 题,都可以在不影响别的部件的前题下进行 修改或替换。”
依赖倒转原则
要针对接口编程,不要对实现编程,无论主 板、CPU、内存、硬盘都是在针对接口编程, 如果针对实现编程,那就会出现换内存需要 把主板也换了的尴尬
Hollywood Principle:don't call us, we'll call you
合成/聚合复用原则
要尽量使用合成/聚合,而不是继承关系达到复 用的目的。 合成/聚合原则就是在一个新的对象里面使 用一些已有的对象,使之成为新对象的一部分; 新的对象通过向这些对象的委派达到复用已有 功能的目的。
单一职责原则
就一个类而言,应该仅有一个引起它变化 的原因(职责)。
如果一个类承担的职责过多,就等于把这 些职责耦合在一起,一个职责的变化可能 会削弱或者抑制这个类完成其他职责的能 力。这种耦合会导致脆弱的设计,当变化 发生时,设计会遭受到意想不到的破坏
象 要针对接口编程,不针对实现编程。
修电脑得到的启示
强内聚、松耦合
由于PC易插拨的方式,那么不管哪一个出问 题,都可以在不影响别的部件的前题下进行 修改或替换。”
依赖倒转原则
要针对接口编程,不要对实现编程,无论主 板、CPU、内存、硬盘都是在针对接口编程, 如果针对实现编程,那就会出现换内存需要 把主板也换了的尴尬
Hollywood Principle:don't call us, we'll call you
合成/聚合复用原则
要尽量使用合成/聚合,而不是继承关系达到复 用的目的。 合成/聚合原则就是在一个新的对象里面使 用一些已有的对象,使之成为新对象的一部分; 新的对象通过向这些对象的委派达到复用已有 功能的目的。
单一职责原则
就一个类而言,应该仅有一个引起它变化 的原因(职责)。
如果一个类承担的职责过多,就等于把这 些职责耦合在一起,一个职责的变化可能 会削弱或者抑制这个类完成其他职责的能 力。这种耦合会导致脆弱的设计,当变化 发生时,设计会遭受到意想不到的破坏
设计模式ppt
5.1.1 工厂模式的由来
在面向对象编程中, 很普遍的方法是用一个new操 作符产生一个对象实例,new操作符就是用来构造 对象实例的。但是在一些情况下, new操作符直接 生成对象会带来一些问题。 首先,要使用new运算符创建一个对象我们必须清 楚所要创建的对象的类信息,而这有时候并不现 实,譬如打开一个视频文件需要一个播放器对象, 但是用户可能不知道具体播放器叫什么名字,而 只需要系统分派给这个视频文件一个合适的播放 器,这种情况下用new运算符是不适宜的;
5.1.4 应用举例
//定义“抽象的”工厂角色 Interface IKFCFactory { KFCFood CreateFood(); } //定义“具体的”工厂角色—鸡腿子工厂 public class ChikenFactory: IKFCFactory { public KFCFood CreateFood() { return new Chicken(); } } //定义“具体的”工厂角色—鸡翅子工厂 public class WingsFactory: IKFCFactory { public KFCFood CreateFood() { return new Wings(); } }
课堂练习
//定义抽象的课程“产品”(Product角色) public abstract class Lectures { public abstract void produce(); }
t1角色—软件工程 //通过继承Lectures类,实现具体生产“软件工程”的方法 public class SoftwareEngineering: Lectures { public override void produce() { Console.WriteLine(―Wenxin Liang: Software Engineering‖) ; } } //ConcretProduct2角色—设计模式 //通过继承Lectures类,实现具体生产“设计模式”的方法 public class DesignPattern: Lectures { public override void produce() { Console.WriteLine(―Wenxin Liang: Design Pattern‖) ; } }
23种设计模式详解及实现方式-课件
panel=new PanelProduct(); } public void buildButton(){
panel.button=new JButton("按钮"); } public void buildLabel(){
bel=new JLabel("标签"); } public void buildTextField(){
使用该模式可以逐步地构造对象,使得对象的 创建更具弹性。生成器模式的关键是将一个包 含有多个组件对象的创建分成若干个步骤,并 将这些步骤封装在一个称作生成器的接口中。
相关的模式
抽象工厂(Abstract Factory)模式 共性:创建型模式、创建类对象 区别: Abstract Factory模式:解决“系列对象”的需求变化 Builder模式:解决“对象部分”的需求变化,通常和组合模
建造者模式的几种演化
省略抽象建造者角色
建造者模式的几种演化
省略指导者角色
THANKS
Builder模式示例
4.指挥者(Director):Director.java import javax.swing.*; public class Director{
private Builder builder; Director(Builder builder){
this.builder=builder; } public JPanel constructProduct(){
builder.buildButton(); builder.buildLabel(); builder.buildTextField(); JPanel product=builder.getPanel(); return product; } }
panel.button=new JButton("按钮"); } public void buildLabel(){
bel=new JLabel("标签"); } public void buildTextField(){
使用该模式可以逐步地构造对象,使得对象的 创建更具弹性。生成器模式的关键是将一个包 含有多个组件对象的创建分成若干个步骤,并 将这些步骤封装在一个称作生成器的接口中。
相关的模式
抽象工厂(Abstract Factory)模式 共性:创建型模式、创建类对象 区别: Abstract Factory模式:解决“系列对象”的需求变化 Builder模式:解决“对象部分”的需求变化,通常和组合模
建造者模式的几种演化
省略抽象建造者角色
建造者模式的几种演化
省略指导者角色
THANKS
Builder模式示例
4.指挥者(Director):Director.java import javax.swing.*; public class Director{
private Builder builder; Director(Builder builder){
this.builder=builder; } public JPanel constructProduct(){
builder.buildButton(); builder.buildLabel(); builder.buildTextField(); JPanel product=builder.getPanel(); return product; } }
设计模式ppt
课堂练习
文档编辑器中的字符对象是使用Flyweight 模式的典型例子,请思考如何使用,并区 分出内部状态和外部状态分别是什么。请 写出使用Flyweight模式的优点。
课堂思考
每个网站的名称不同,该如何修改代码?
内部状态 在享元对象内部,不会随环境改变而改变 的共享部分—网站分类 外部状态 随环境改变而改变的,不可以共享的状态 --用户名称
享元模式执行时需要的状态可分为内部状 态和外部状态,内部状态存储于 ConcreteFlyweight对象之中,而外部对 象通常由客户端存储或计算。当客户端调 用Flyweight对象操作时,将外部状态传递 给它。
6.3.1 桥接模式的由来
由于手机都需要通讯录功能,需要在N品牌和M品 牌都增加通讯录功能,程序该如何编写?
6.3.1 桥接模式的由来
6.3.1 桥接模式的由来
需要在N品牌和M品牌都增加MP3音乐播放功能, 程序该如何编写?
6.3.1 桥接模式的由来
思考同样的问题
来了一家新的品牌S,也有游戏、通讯录和 MP3播放功能 还需要增加输入法功能、拍照功能,再增 加L品牌、X品牌,如何编写程序?
6.3.1 桥接模式的由来
假设有一个N品牌的手机,使用Android系统,它 有一个小游戏,客户想要玩游戏,程序该如何编 写?
6.3.1 桥接模式的由来
6.3.1 桥接模式的由来
假设又有一个M品牌的手机,使用iOS系统,也有 一个小游戏,客户端也可以调用,程序该如何编 写?
6.3.1 桥接模式的由来
6.3.1 桥接模式
待实现的系统可能有多角度分类,每一种分类都 有可能变化,那么就把这种多角度分离出来让他 们独立变化,减少他们之间的耦合
设计模式概述精品PPT课件
5大原则
泛化
实现
关联
聚合
组合
依赖
设计模式 设计关系 设计原则
3种模式
6大关系 5大原则
创建型
结构型
行为型
结束语
当你尽了自己的最大努力时,失败也是伟大的, 所以不要放弃,坚持就是正确的。
When You Do Your Best, Failure Is Great, So Don'T Give Up, Stick To The End
设计模式
--开启码农的艺术之旅
设计模式 设计关系 设计原则
3大模式 6大关系 5大原则
设计模式 设计关系 设计原则
3种模式 6大关系
5大原则
S – 单一职责原则
O – 开放封闭原则
L – 里氏替换原则
I – 接口隔离原则
D – 依赖倒置原则
设计模式 设计关系 设计原则
3种模式
6大关系
感谢聆听
பைடு நூலகம்不足之处请大家批评指导
Please Criticize And Guide The Shortcomings
演讲人:XXXXXX 时 间:XX年XX月XX日
泛化
实现
关联
聚合
组合
依赖
设计模式 设计关系 设计原则
3种模式
6大关系 5大原则
创建型
结构型
行为型
结束语
当你尽了自己的最大努力时,失败也是伟大的, 所以不要放弃,坚持就是正确的。
When You Do Your Best, Failure Is Great, So Don'T Give Up, Stick To The End
设计模式
--开启码农的艺术之旅
设计模式 设计关系 设计原则
3大模式 6大关系 5大原则
设计模式 设计关系 设计原则
3种模式 6大关系
5大原则
S – 单一职责原则
O – 开放封闭原则
L – 里氏替换原则
I – 接口隔离原则
D – 依赖倒置原则
设计模式 设计关系 设计原则
3种模式
6大关系
感谢聆听
பைடு நூலகம்不足之处请大家批评指导
Please Criticize And Guide The Shortcomings
演讲人:XXXXXX 时 间:XX年XX月XX日
设计模式PPT
结构型模式
• Flyweight(享元)
结构型模式
• Proxy(追求者-代理-被追求者)
– 意图
• 为其他对象提供一种代理以控制对这个对象的访问。
– 适用性
• 1)远程代理(Remote Proxy)为一个对象在不同的地址空间 提供局部代表。 • 2)虚代理(Virtual Proxy)根据需要创建开销很大的对象。 • 3)保护代理(Protection Proxy)控制对原始对象的访问。 • 4)智能引用(Smart Reference)取代了简单的指针,它在 访问对象时执行一些附加操作。
行为模式
• Interpreter(自学)
– 意图
• 根据语言的文法,定义一个解释器,用来解释语言中的句 子。
– 适用性
• 当有一个语言需要解释执行,并且该语言中的句子可以表 示为一个抽象语法树时。 当满足以下情况时,解释器模式的效果最好:
– 文法简单。 – 效率不是一个关键问题。
行为模式
• Iterator(迭代器)
– 实现 • 使用一个原型管理器; • 实现克隆操作(浅拷贝和深拷贝); • 初始化克隆对象;
创建型模式
• Singleton(打印机)
– 意图
• 保证一个类仅有一个实例,并提供一个访问它的全局访问 点。
– 适用性
• 在一个系统要求一个类只有一个实例时才应当使用单例模 式
创建型模式
• Singleton
创建型模式
• Builder(建造小人)
– 意图
• 将一个复杂对象的构建与它的表示分离,使得同样的构建 过程可以创建不同的表示。
– 适用性
• 当创建复杂对象的算法应该独立于该对象的组成部分以及 它们的装配方式时。 • 当构造过程必须允许被构造的对象有不同的表示时。
软件工程概述及设计模式ppt课件
} public String getName() {
return addressName ; } public void setName(String name) {
addressName = name; } }
精选课件
15
1 OO概述
public class Client{ public static void main(String[] args) { Driver d = new Driver(); d.setName("老张"); //d.drive(new Plane()); d.drive(new Car()); }
精选课件
3
1 OO概述
老张开车去东北。 请用OO思想进行分析(OOA)和设计(OOD)。 封装类(名词):
精选课件
4
1 OO概述 老张开车去东北。
封装 创建成员方法。
精选课件
5
1 OO概述 老张开车去东北。 获取属性,完善成员方法。
精选课件
6
1 OO概述 老张开车去东北。
封装:作用? 隐藏信息,降低类间耦合性。
目录
1 OO概述 2 面向接口编程 3 OO六大原则
4 常用设计模式
精选课件
1
1 OO概述
➢ 面向对象分析(OOA) 做什么? 从问题域中获取需要的类和对象,以及它们之间的关系。
➢ 面向对象设计(OOD) 怎么做?
➢ 面向对象编程(OOP) Do it
精选课件
2
1 OO概述 老张开车去东北。 请用OO思想进行分析(OOA)和设计(OOD),体现OO三大特性 封装类(名词):
}
public class Car extends Vihecle{ public void go(Address dest) { System.out.println("一路哼着歌,冒着烟,去了" + dest.getName()); }
return addressName ; } public void setName(String name) {
addressName = name; } }
精选课件
15
1 OO概述
public class Client{ public static void main(String[] args) { Driver d = new Driver(); d.setName("老张"); //d.drive(new Plane()); d.drive(new Car()); }
精选课件
3
1 OO概述
老张开车去东北。 请用OO思想进行分析(OOA)和设计(OOD)。 封装类(名词):
精选课件
4
1 OO概述 老张开车去东北。
封装 创建成员方法。
精选课件
5
1 OO概述 老张开车去东北。 获取属性,完善成员方法。
精选课件
6
1 OO概述 老张开车去东北。
封装:作用? 隐藏信息,降低类间耦合性。
目录
1 OO概述 2 面向接口编程 3 OO六大原则
4 常用设计模式
精选课件
1
1 OO概述
➢ 面向对象分析(OOA) 做什么? 从问题域中获取需要的类和对象,以及它们之间的关系。
➢ 面向对象设计(OOD) 怎么做?
➢ 面向对象编程(OOP) Do it
精选课件
2
1 OO概述 老张开车去东北。 请用OO思想进行分析(OOA)和设计(OOD),体现OO三大特性 封装类(名词):
}
public class Car extends Vihecle{ public void go(Address dest) { System.out.println("一路哼着歌,冒着烟,去了" + dest.getName()); }
软件设计模式ppt课件
*
* @author Administrator
*
*/
精选ppt
42
创建型模式之一(工厂方法模式)
package com.demo.factory;
import com.demo.factory.itf.ISwordFactory; import com.demo.factory.model.AbstractSword; import com.demo.factory.model.object.QixingSword;
实例二(多文档)
精选ppt
25
接口的作用
接口的定义方面来说,接口其实就是类和类之间的一种 协定,一种约束(安全性).
方便统一管理.另一个是方便调用
提高模块内的内聚性,降低模块间的耦合性.
扩展性
使用方便,可读性强,结构清晰的特点。
interface IBark { void Bark(); }
够有静态的不能被修改的数据成员(也就是必须 是static final的,不过在 interface中一般不定义 数据成员),所有的成员方法都是abstract的。
abstract class和interface所反映出的设计理念不
同。其实abstract class表示的是"is-a"关系,
精选ppt
精选ppt
3
设计模式的基本概念-软件危 机
软件危机的产生原因
✓ 与软件本身的特点有关。软件不同于硬件,它是计算机 系统中的逻辑部件而不是物理部件;软件不会因使用时 间过长而“老化”或“用坏”;在写出程序代码并在计 算机上试运行之前,软件开发过程的进展情况较难衡量, 软件质量也较难评价,因此管理和控制软件开发过程十 分困难;软件质量不是根据大量制造的相同实体的质量 来度量,而是与每一个组成部分的不同实体的质量紧密 相关,因此,在运行时所出现的软件错误几乎都是在开 发时期就存在而一直未被发现的,改正这类错误通常意 味着改正或修改原来的设计,这就在客观上使得软件维 护远比硬件维护困难;软件是一种信息产品,具有可延 展性,属于精柔选p性pt 生产,与通用性强的硬件相比,软件更 4
java设计模式ppt课件
接口隔离原则
客户端不应该强制依赖于它 不使用的接口,一个类对另 一个类的依赖性应当是最小 的。
新兴的设计模式
策略模式
定义一系列的算法,并将每一个算法封 装起来,使它们可以互相替换,让算法
独立于使用它的客户。
装饰器模式
动态的给一个对象增加一些额外的职 责,就增加对象的功能来说,装饰器
模式相比生成子类更为灵活。
设计模式的重要性
总Байду номын сангаас词
设计模式有助于提高软件的可维护性、 可扩展性和可重用性。
VS
详细描述
设计模式的使用可以帮助开发者设计出更 加灵活、稳定和可维护的软件系统。通过 使用设计模式,开发者可以更好地组织和 管理代码,提高代码的可读性和可维护性 。同时,设计模式还可以提供一种标准的 、通用的解决方案,使得代码更加易于理 解和重用,提高软件的可扩展性和可重用 性。
实现方式
通过将构造函数私有化,并提供一个静态的公有 的方法来获取该类的唯一实例。
建造者模式
01 总结词
提供了一种构建对象的最佳方 式。
02
详细描述
建造者模式是一种创建型设计 模式,它提供了一种构建对象 的最佳方式。通过使用建造者 模式,可以将一个复杂对象的 构建过程分解成一系列简单的 步骤,使得构建过程更加清晰 和易于管理。
设计模式的分类
要点一
总结词
设计模式可以根据不同的角度进行分类,如创建型、结构 型和行为型等。
要点二
详细描述
根据不同的角度,设计模式可以分为多种类型。其中常见 的分类方式包括创建型、结构型和行为型。创建型设计模 式关注对象的创建和实例化过程,如工厂模式、单例模式 等;结构型设计模式关注对象之间的结构关系,如适配器 模式、装饰器模式等;行为型设计模式关注对象的行为和 交互方式,如策略模式、观察者模式等。
设计模式培训教材PPT课件( 96页)
Strategy模式
目的:在对象中封装算法
构成
Stragey对象:封装了不同的算法 Compositor
操作环境:
Composition
关键点
为Strategy和它的环境设计足够通用的接口,以支持一系 列的算法
2.4 修饰用户界面
修饰用户界面
两种修饰
边界 滚动条
The pattern is , in short , at the same time a thing , which happens in the world , and the rule which tells us how to create that thing , and when we must create it . It’s both a process and a thing , both a description of a thing which is alive , and a description of the process which will generate that thing .
自由增加Glyph子类而不考虑格式算法 增加格式算法不要求修改已有的图元类
将算法独立出来,封装到对象中
定义一个封装格式化算法的对象的类层次结构
2.3.2 Compositor与Composition
Compositor :封装了格式化算法的对象 Composition:被格式化的图元
修饰用户界面解决方案2 : 对象组合
装饰对象(e.g. Border) VS 图元(Glyph)
在边界中包含图元 在图元中包含边界 需要修改已存在的代码
2.4.1透明围栏
第11讲:设计模式
模式的结构中包括一种角色:
单例类(Singleton)
单例模式的应用实例(1/2)
1.单例类(Singleton): Moon.java
public class Moon{ private static Moon uniqueMoon; double radius; double distanceToEarth; private Moon(){ uniqueMoon=this; radius=1738; distanceToEarth=363300; }
内容回顾
系统设计 软件体系结构设计 硬件体系结构设计
详细设计 对象设计 对象持久化设计
面向对象的设计原则 设计模式
1
面向对象设计原则
单一职责原则 开放-封闭原则 接口隔离原则 Liskov替换原则 依赖倒置原则
如何遵守设计原则
设计原则不是死记硬背,而是要灵活运用 一些成熟的设计模式可以帮助我们解决实际问题,并且符
import java.awt.*;
public class Application{
public static void main(String args[]){ MyFrame f1=new MyFrame("张三看月亮"); MyFrame f2=new MyFrame( "李四看月亮");
…… } }
决定实例化哪一个类。工厂方法使一个类的实例化延迟到 其子类
应用背景:当系统准备为用户提供某个类的子类的实例,
又不想让用户代码和该子类形成耦合时,就可以使用工厂 方法模式来设计系统
工厂模式的关键:是在一个接口或抽象类中定义一个抽
象方法,该方法返回某个类的子类的实例,该抽象类或接 口让其子类或实现该接口的类通过重写这个抽象方法返回 某个子类的实例
单例类(Singleton)
单例模式的应用实例(1/2)
1.单例类(Singleton): Moon.java
public class Moon{ private static Moon uniqueMoon; double radius; double distanceToEarth; private Moon(){ uniqueMoon=this; radius=1738; distanceToEarth=363300; }
内容回顾
系统设计 软件体系结构设计 硬件体系结构设计
详细设计 对象设计 对象持久化设计
面向对象的设计原则 设计模式
1
面向对象设计原则
单一职责原则 开放-封闭原则 接口隔离原则 Liskov替换原则 依赖倒置原则
如何遵守设计原则
设计原则不是死记硬背,而是要灵活运用 一些成熟的设计模式可以帮助我们解决实际问题,并且符
import java.awt.*;
public class Application{
public static void main(String args[]){ MyFrame f1=new MyFrame("张三看月亮"); MyFrame f2=new MyFrame( "李四看月亮");
…… } }
决定实例化哪一个类。工厂方法使一个类的实例化延迟到 其子类
应用背景:当系统准备为用户提供某个类的子类的实例,
又不想让用户代码和该子类形成耦合时,就可以使用工厂 方法模式来设计系统
工厂模式的关键:是在一个接口或抽象类中定义一个抽
象方法,该方法返回某个类的子类的实例,该抽象类或接 口让其子类或实现该接口的类通过重写这个抽象方法返回 某个子类的实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面向对象设计原则
设计原则名称 单一职责原则 (Single Responsibility Principle, SRP) 开闭原则 (Open-Closed Principle, OCP)
里氏代换原则 (Liskov Substitution Principle, LSP) 依赖倒转原则 (Dependency Inversion Principle, DIP) 接口隔离原则 (Interface Segregation Principle, ISP) 合成复用原则 (Composite Reuse Principle, CRP) 迪米特法则 (Law of Demeter, LoD)
章软件体系结构概述
No
Image 任课教师:张伟芝 zhangweizhi@
课程内容
课程简介 课程内容及学习方式 第一个设计模式——单例模式 好设计的原则
课程内容
课程简介 课程内容及学习方式 第一个设计模式——单例模式 好设计的原则
C’X’O
技 术 经 理 项 目 经 理
设计正在“腐烂”的征兆
Robert C.Martin
过于僵硬Rigidity
过于脆弱Fragility
不可重用性immobility
粘滞性过高viscosity
好的系统设计应该具备如下三个性质 Peter Coad
可扩展性(Extensibility)
灵活性(Flexibility)
可插入性(Pluggability)
模板方法模式
分离 “共性功能实现”和“个性扩展”
遵守单一职责原则的设计模式
命令模式
分离“命令的请求者”和“命令的实现者”
遵守单一职责原则的设计模式
代理模式
分离 “服务的请求者”和“服务的提供者”
遵守单一职责原则的体系结构模式
一个模块、子系统也应该仅有一个引起它变化 的原因
开闭原则
Open(Open for extension)
我们讲什么?
设计模式 体系结构模式
什么是模式?
模式是一条由三部分组成的规则。 一个特定环境、一个问题、一个解决方案。
他们之间的关系
学习的方式
环境+问题+解决方案
全国交通违法数据联网——环境
全国交通违法数据联网——问题
平台异构 语言异构 系统架构异构
全国交通违法数据联网——解决方案
面向服务的体系结构——SOA!
单一职责原则
高内聚性原则 避免相同的职责(也称为功能)分散到不同的 类中实现。 避免一个类承担过多的职责。
可以减少类之间的耦合
单一职责原则示例
类的设计主要工作是“发现职责”并“分离职责”
数据库连接和数据库访问操作相互分离
遵守单一职责原则的设计模式
工厂模式
分离对象的“创建”和对象的“使用”
遵守单一职责原则的设计模式
模块的行为必须是开放的、支持扩展的,而不是僵 化的
Closed(Closed for modification)
在对模块的功能进行扩展时,不应该影响或大规模 地影响已有的程序模块
绝大部分的设计模式都符合开闭原则 抽象化是开闭原则的关键
要求开发人员可以在不修改系统中现有的功能代码的 前提下,而实现对应用系统的软件功能进行扩展
工程师 设计师 分析师 架构师
教材及参考书
考核方式
必修课
36学时、2学分
平时成绩:30%
平时表现:10%(课堂提问、课堂纪律、课堂出勤)
平时作业:20%(以4~5人为一个小组)
期末成绩:70%
考试形式:闭卷、笔试
10
20
平时表现10%
70
平时作业20%
期末考试70%
课程内容
课程简介 课程内容及学习方式பைடு நூலகம்第一个设计模式——单例模式 好设计的原则
接口的污染!!!
如何避免不良好的接口设计
用多个专门的接口,而不使用单一的总接口。 一个接口就只代表一个角色 使用接口隔离原则拆分接口时,首先必须满足 单一职责原则
课程内容
课程简介 课程内容及学习方式 第一个设计模式——单例模式 好设计的原则
第一个设计模式——单例模式
第一个设计模式——单例模式
单例模式要解决的问题——独生子女
解决方案——Static
public partial class Form2 : Form { public static Form2 instance;
当子类的方法实现父类的抽象方法时,方法的后 置条件(即方法的返回值)要比父类更严格。
依赖倒置原则
将依赖关系倒置为依赖接口
上层模块不应该依赖于下层模块,它们共同依赖于 一个抽象 父类不能依赖子类,它们都要依赖抽象类 抽象不能依赖于具体,具体应该要依赖于抽象
接口隔离
一个类对另外一个类的依赖性应当是建立在最小 的接口上 客户端不应该依赖那些它不需要的接口(方法)
设计原则简介
类的职责要单一,不能将太多的职责放在一个类 中。
软件实体对扩展是开放的,但对修改是关闭的, 即在不修改一个软件实体的基础上去扩展其 功能。
在软件系统中,一个可以接受基类对象的地方必 然可以接受一个子类对象。
要针对抽象层编程,而不要针对具体类编程。
重要性 ★★★★☆ ★★★★★
★★★★☆ ★★★★★
使用多个专门的接口来取代一个统一的接口。 ★★☆☆☆
在系统中应该尽量多使用组合和聚合关联关系, 尽量少使用甚至不使用继承关系。
一个软件实体对其他实体的引用越少越好,或者 说如果两个类不必彼此直接通信,那么这两 个类就不应当发生直接的相互作用,而是通 过引入一个第三者发生间接交互。
★★★★☆ ★★★☆☆
里氏代换原则
主要是针对继承的设计原则
子类型必须能够替换掉它们的父类型、并出现 在父类能够出现的任何地方。
子类可以扩展父类的功能,但不能改变父类原 有的功能。
里氏替换原则
子类可以实现父类的抽象方法,但不能覆盖父类 的非抽象方法。
子类中可以增加自己特有的方法。
当子类的方法重载父类的方法时,方法的前置条 件(即方法的形参)要比父类方法的输入参数更 宽松。
public static Form2 GetInstance() {
if (instance==null) {
instance = new Form2(); } return instance; } }
第一个设计模式——单例模式
课程内容
课程简介 课程内容及学习方式 第一个设计模式——单例模式 好设计的原则