logo资料库

韩顺平_Java设计模式笔记.docx

第1页 / 共200页
第2页 / 共200页
第3页 / 共200页
第4页 / 共200页
第5页 / 共200页
第6页 / 共200页
第7页 / 共200页
第8页 / 共200页
资料共200页,剩余部分请下载后查看
第1章 内容介绍和授课方法
1.1 Java设计模式内容介绍
1.1.1 先看几个经典的面试题
(1) 原型设计模式问题
(2) 设计模式的七大原则
(3) 金融借贷平台项目
(4) 解释器设计模式
(5) 单例设计模式
1.1.2 设计模式的重要性/应用场景
1.2 课程亮点和授课模式
第2章 设计模式七大原则
2.1 设计模式的目的
2.2 设计模式七大原则
2.3 单一职责原则
2.3.1 基本介绍
2.3.2 应用实例
(1) 方案一
(2) 方案二
(3) 方案三
2.3.3 注意事项和细节
2.4 接口隔离原则(Interface Segregation Principle)
2.4.1 基本介绍
2.4.2 应用实例
(1) 没有使用接口隔离原则的代码
(2) 使用接口隔离原则改进
2.5 依赖倒转原则
2.5.1 基本介绍
2.5.2 应用实例
(1) 传统方式
(2) 改进方式
2.5.3 依赖关系传递的三种方式
(1) 接口传递
(2) 构造方法传递
(3) setter方式传递
2.5.4 注意事项和细节
2.6 里式替换原则
2.6.1 OO中的继承性的思考和说明
2.6.2 基本介绍
2.6.3 一个程序引出的问题和思考
(1) 问题
(2) 解决方法
(3) 改进方案
2.7 开闭原则
2.7.1 基本介绍
2.7.2 应用实例
(1) 案例
(2) 改进方案
2.8 迪米特法则
2.8.1 基本介绍
2.8.2 应用实例
(1) 案例
(2) 案例改进
2.8.3 注意事项和细节
2.9 合成复用法则(Composite Reuse Principle)
2.9.1 基本介绍
2.10 设计原则核心思想
第3章 UML类图
3.1 UML基本介绍
3.2 UML图
3.3 UML类图
3.3.1 类图-依赖关系
3.3.2 类图-泛化关系(Generalization)
3.3.3 类图-实现关系(Implementation)
3.3.4 类图-关联关系(Association)
3.3.5 类图-聚合关系(Aggregation)
(1) 基本介绍
(2) 应用实例
3.3.6 类图-组合关系(Composition)
(1) 基本介绍
(2) 应用案例
第4章 设计模式概述
4.1 掌握设计模式的层次
4.2 设计模式介绍
4.3 设计模式类型
第5章 单例设计模式
5.1 单例设计模式介绍
5.2 单例设计模式八种方式
5.2.1 饿汉式(静态常量)
(1) 应用实例
(2) 优缺点说明
5.2.2 饿汉式(静态代码块)
(1) 应用实例
(2) 优缺点说明
5.2.3 懒汉式(线程不安全)
(1) 应用实例
(2) 优缺点说明
5.2.4 懒汉式(线程安全,同步方法)
(1) 应用实例
(2) 优缺点说明
5.2.5 懒汉式(线程不安全,同步代码块)
(1) 应用实例
(2) 优缺点说明
5.2.6 双重检查
(1) 应用实例
(2) 优缺点说明
5.2.7 静态内部类
(1) 应用实例
(2) 优缺点说明
5.2.8 枚举
(1) 应用实例
(2) 优缺点说明
5.3 单例模式在JDK应用的源码分析
5.4 单例模式注意事项和细节说明
第6章 工厂模式
6.1 简单工厂模式
6.1.1 一个具体需求
6.1.2 使用传统的方式来完成
(1) 思路分析
(2) 代码实现
(3) 传统方式的优缺点
(4) 改进的思路分析
6.1.3 简单工厂模式基本介绍
6.1.4 使用简单工厂模式
(1) 代码实现
(2) 分析扩展
6.2 工厂方法模式
6.2.1 看一个新的需求
(1) 思路一
(2) 思路二
6.2.2 工厂方法模式介绍
(1) 工厂方法模式设计方案
(2) 工厂方法模式
(3) 工厂方法模式应用案例
6.3 抽象工厂模式
6.3.1 基本介绍
6.3.2 应用实例
6.4 工厂模式在JDK-Calendar应用的源码分析
6.5 工厂模式小结
第7章 原型模式
7.1 克隆羊问题
7.1.1 传统方式解决克隆羊问题
(1) 思路分析(图解)
(2) 代码实现
(3) 传统方式的优缺点
(4) 改进的思路分析
7.2 原型模式基本介绍
7.2.1 基本介绍
7.2.2 原理结构图-UML类图
7.2.3 原型模式解决克隆羊问题
7.3 原型模式在Spring框架中源码分析
7.4 深入讨论-浅拷贝和深拷贝
7.4.1 浅拷贝的介绍
7.4.2 深拷贝基本介绍
7.4.3 深拷贝应用实例
[DeepPrototype.java]
[DeepCloneable.java]
[Client.java]
7.5 原型模式的注意事项和细节
第8章 建造者模式
8.1 盖房项目需求
8.1.1 传统方式解决盖房需求
(1) 思路分析
(2) 代码实现
(3) 传统方式的问题分析
8.2 建造者模式
8.2.1 基本介绍
8.2.2 建造者模式的四个角色*
8.2.3 建造者模式原理类图
8.3 建造者模式解决盖房需求
8.3.1 思路分析图解(类图)
8.3.2 具体实现
[House.java]
[HouseBuider.java]
[CommonHouse.java]/[HighBuilding.java]
[HouseDirector.java]
[Client.java]
8.4 建造者模式在JDK应用和源码分析
8.5 建造者模式的注意事项和细节
第9章 适配器模式
9.1 现实生活中的例子
9.2 基本介绍
9.3 工作原理
9.4 类适配器模式
9.4.1 类适配器模式介绍
9.4.2 类适配器应用实例
(1) 应用实例说明
(2) 思路分析(类图)
(3) 代码实现
[Voltage220V.java]
[Ivoltage5V.java]接口
[VoltageAdapter.java]
[Phone.java]
[Client.java]
9.4.3 类适配器模式注意事项和细节
9.5 对象适配器模式
9.5.1 对象适配器模式介绍
9.5.2 对象适配器应用实例
(1) 应用实例说明
(2) 思路分析(类图)
(3) 代码实现
[VoltageAdapter.java]
[Client.java]
9.5.3 对象适配器模式注意事项和细节
9.6 接口适配器模式
9.6.1 接口适配器模式介绍
9.6.2 接口适配器模式应用实例
(1) 应用实例一
(2) 应用实例二
1) 示意图
2) 代码实现
9.7 适配器在SpringMVC框架中的应用
(4) 代码分析+Debug 源码
(5) 模拟SpringMVC
[Controller.java]
[HandlerAdapter.java]
[DispatchServlet.java]
9.8 适配器模式的注意事项和细节
第10章 桥接模式
10.1 手机操作问题
10.1.1 传统方式解决手机操作问题
(1) 类图
(2) 传统方式分析
10.2 桥接模式(Bridge)
10.2.1 基本介绍
10.2.2 桥接模式原理类图
10.2.3 桥接模式解决手机操作问题
(1) 对应类图
(2) 代码实现
[Brand.java]接口
[Vivo.java]/[Xiaomi.java]
[Phone.java]
[FoldedPhone.java]/[UprightPhone.java]
10.3 桥接模式在JDBC的源码剖析
10.4 桥接模式的注意事项和细节
10.5 桥接模式的应用场景
第11章 装饰者设计模式
11.1 星巴克咖啡订单项目
11.1.1 方案一-较差的方案
(1) 类图
(2) 方案一问题分析
11.1.2 方案二-较好的方案
11.2 装饰者模式
11.2.1 装饰者模式定义
11.2.2 装饰者模式原理
11.2.3 用装饰者模式解决星巴克咖啡订单
(1) 用装饰者模式设计的方案
(2) 装饰者模式下的订单
(3) 代码实现
接口[Drink.java]
[Coffee.java]
[Espresso.java]/[LongBlack.java]/[ShortBlack.java]
[Decorator.java]
[Chocolate.java]/[Milk.java]/[Soy.java]
[CoffeeBar.java]使用
11.3 装饰者模式在JDK中的应用:FileterInputStream
第12章 组合模式
12.1 学校院系展示需求
12.1.1 传统方案解决学校院系展示
(1) 类图
(2)问题分析
12.2 组合模式
12.2.1 基本介绍
12.2.2 组合模式的原理类图
12.2.3 组合模式解决的问题
12.2.4 组合模式解决学校院系展示
(1) 应用实例要求
(2) 思路分析和图解(类图)
(3) 代码实现
[OrganizationComponent.java]
[University.java]
[College.java]
[Department.java]
[Client.java]
12.3 组合模式在JDK集合中的应用:HashMap
12.4 组合模式的注意事项和细节
第13章 外观模式
13.1 影院管理项目
13.1.1 传统方式解决影院管理
13.1.2 传统方式解决影院管理问题分析
13.2 外观模式
13.2.1 外观模式基本介绍
13.2.2 外观模式原理类图
13.2.3 外观模式解决影院管理
13.2.4 外观模式应用实例
(1) 思路分析和图解(类图)
(2) 代码实现
[DVDPlayer.java]
[Popcorn.java]
[HomeTheaterFacade.java]
[Client.java]
13.3 外观模式在MyBatis框架应用的源码分析
13.4 外观模式的注意事项和细节
第14章 享元模式
14.1 展示网站项目需求
14.1.1 传统方案解决网站展现项目
14.1.2 传统方式的问题分析
14.2 享元模式
14.2.1 基本介绍
14.2.2 享元模式的原理类图
(1) 对原理图的说明(即模式的角色及职责)
(2) 内部状态和外部状态
14.2.3 享元模式解决网站展现项目
(1) 思路分析和图解(类图)
(2) 代码实现
[Website.java]
[ConcreteWebsite.java]
[WebsiteFactory.java]
[User.java]
[Client.java]
14.3 享元模式在JDK-Integer中的应用
14.4 享元模式的注意事项和细节
第15章 代理模式
15.1 代理模式Proxy
15.1.1 基本介绍
15.1.2 代理模式示意图
15.2 静态代理
15.2.1 静态代码模式的基本介绍
15.2.2 应用实例
(1) 具体要求
(2) 思路分析图解(类图)
(3) 代码实现
[ITeacher.java]
[TeacherDao.java]
[TeacherDaoProxy.java]
[Client.java]
15.2.3 静态代理优缺点
15.3 动态代理
15.3.1 动态代理模式的基本介绍
15.3.2 JDK中生成代理对象的API
15.3.3 动态代理应用实例
(1) 思路图解(类图)
(2) 代码实现
[IteacherDao.java]
[TeacherDao.java]
[ProxyFactory.java]
[Client.java]
15.4 Cglib代理
15.4.1 Cglib代理模式的基本介绍
15.4.2 Cglib代理模式实现步骤
15.4.3 Cglib代理模式应用实例
(1) 思路图解(类图)
(2) 代码实现+Debug源码
[TeacherDao.java]
[ProxyFactory.java]
[Client.java]
15.5 几种常见的代理模式介绍—几种变体
第16章 模板方法模式
16.1 豆浆制作问题
16.2 模板方法模式
16.2.1 基本介绍
16.2.2 模板方法模式原理类图
16.2.3 模板方法模式解决豆浆制作问题
(1) 思路分析和图解(类图)
(2) 代码实现
[SoyaMilk.java]
[RedBeanSoyaMilk.java]
[PeanutSoyMilk.java]
[Client.java]
16.2.4 模板方法模式的钩子方法
[SoyaMilk.java]
[PureSoyaMilk.java]
[Client.java]
16.3 模板方法模式在Spring框架中的应用
16.4 模板方法模式的注意事项和细节
第17章 命令模式
17.1 智能生活项目需求
17.2 命令模式
17.2.1 基本介绍
17.2.2 命令模式的原理类图
17.2.3 命令模式解决智能生活项目
(1) 思路分析和图解
(2) 代码实现
[Command.java]
[LightReceiver.java]
[LightOnCommand.java]
[LightOffCommand.java]
[NoCommand.java]
[RemoteController.java]
[Client.java]
17.3 命令模式在Spring框架JdbcTemplate中的应用
17.4 命令模式的注意事项和细节
第18章 访问者模式
18.1 测评系统的需求
18.1.1 传统方案
18.2 访问者模式
18.2.1 基本介绍
18.2.2 访问者模式的原理类图
18.2.3 访问者模式应用实例
(1) 思路分析和图解(类图)
(2) 代码实现
[Action.java]
[Success.java]/[Fail.java]
[Person.java]
[Man.java]/[Woman.java]
[ObjectStructure.java]
[Client.java]
(3) 应用案例的小结-双分派
18.3 访问者模式的注意事项和细节
第19章 迭代器模式
19.1 显示学校院系结构需求
19.1.1 传统的设计方案
(1) 类图
(2) 传统方式的问题分析
19.2 迭代器模式
19.2.1 基本介绍
19.2.2 原理类图
19.2.3 应用实例
(1) 设计思路分析
(2) 代码实现
[Department.java]
[ComputerCollegeIterator.java]
[InfoCollegeIterator.java]
[College.java]
[ComputerCollege.java]
[InfoCollege.java]
[OutputImpl.java]
[Client.java]
19.3 迭代器模式在JDK-ArrayList集合中的应用
19.4 迭代器模式的注意事项和细节
第20章 观察者模式
20.1 天气预报项目需求
20.1.1 设计方案1—普通方案
(1) WheatherData类
(2) 代码实现
[CurrentConditions.java]
[WeatherData.java]
[Client.java]
(3) 问题分析
20.2 观察者模式
20.2.1 观察者模式原理
20.2.2 观察者模式解决天气预报需求
(1) 类图说明
(2) 代码实现
[Subject.java]
[Observer.java]
[WeatherData.java]
[CurrentCondition.java]/[BaiduSite.java]
[Client.java]
(3) 好处
20.3 观察者模式在JDK应用的源码分析
第21章 中介者模式
21.1 智能家庭管理问题
20.1.1 传统方案解决智能家庭管理问题
20.1.2 传统方式的问题分析
21.2 中介者模式
21.2.1 基本介绍
21.2.2 中介者模式的原理类图
21.2.3 中介者模式应用实例
(1) 思路分析和图解(类图)
(2) 代码实现
[Mediator.java]
[Colleague.java]
[ConcreteMediator.java]
[Alarm.java]
[CoffeeMachine.java]
[Curtains.java]/[TV.java]
[ClientTest.java]
21.3 中介者模式的注意事项和细节
第22章 备忘录模式
22.1 游戏角色状态恢复问题
22.1.1 传统方案解决游戏角色恢复
22.1.2 传统方式的问题分析
22.2 备忘录模式
22.2.1 基本介绍
22.2.2 原理类图
22.2.3 原理类图代码实现
[Originator.java]
[Memento.java]
[CareTaker.java]
[Client.java]
22.2.4 游戏角色恢复状态实例
(1) 思路分析和图解(类图)
(2) 代码实现
[Memento.java]
[CareTaker.java]
[GameRole.java]
[Client.java]
22.3 备忘录模式的注意事项和细节
第23章 解释器模式
23.1 四则运算问题
23.1.1 传统方式解决四则运算问题分析
23.2 解释器模式
23.2.1 基本介绍
23.2.2 原理类图
23.2.3 解释器模式实现四则运算
(1) 思路分析和图解
(2) 代码实现
[Expression.java]
[VarExpression.java]
[SymbolExpression.java]
[AddExpression.java]
[SubExpression.java]
[Calculator.java]
[ClientTest.java]
23.3 解释器模式在Spring框架中的应用
23.4 解释器模式的注意事项和细节
第24章 状态模式
24.1 APP抽奖活动问题
24.2 状态模式
24.2.1 基本介绍
24.2.2 原理类图
24.2.3 状态模式解决APP抽奖问题
(1) 思路分析和图解(类图)
(2) 代码实现
[State.java]
[NoRaffleState.java]
[CanRaffleState.java]
[DispenseState.java]
[DispenseOutState.java]
[RaffleActivity.java]
[ClientTest.java]
24.3 状态模式在实际项目-借贷平台的应用分析
24.3.1 传统方式
24.3.2 使用状态模式
(1) 状态图
(2) 关系表
(3) 类图
(4) 代码实现
[State.java]
[AbstractState.java]
[AllState.java]
[StateEnum.java]
[Context.java]
[ClientTest.java]
24.4 状态模式的注意事项和细节
第25章 策略模式
25.1 鸭子项目
25.1.1 传统方式解决鸭子问题
(1) 传统的设计方案(类图)
(2) 代码实现
[Duck.java]
[WildDuck.java]
[PekingDuck.java]
[ToyDuck.java]
25.1.2 传统方式实现的问题分析和解决方案
25.2 策略模式
25.2.1 基本介绍
25.2.2 策略模式的原理类图
25.2.3 策略模式解决鸭子问题
(1) 思路分析(类图)
(2) 代码实现
[FlyBehavior.java]/[QuackBehavior.java]
[GoodFlyBehavior.java]/[BadFlyBehavior.java]/[NoFl
[Duck.java]
[WildDuck.java]
[PekingDuck.java]/[ToyDuck.java]
[Client.java]
25.3 策略模式在JDK-Arrays中的应用分析
25.4 策略模式的注意事项和细节
第26章 职责链模式
26.1 OA系统采购审批需求
26.1.1 传统方案解决OA系统审批
(1) 传统的设计方案(类图)
(2) 传统方案解决OA系统审批问题分析
26.2 职责链模式
26.2.1 基本介绍
26.2.2 原理类图
26.2.3 职责链模式解决OA系统采购审批
(1) 思路分析和图解(类图)
(2) 代码实现
[PurchaseRequest.java]
[Approver.java]
[DepartmentApprover.java]/ [CollegeApprover.java]/
[Client.java]
26.3 职责链模式在SpringMVC框架中的应用分析
26.3.1 SpringMVC 请求流程简图
26.3.2 代码分析
26.3.3 Debug源码+说明
26.4 职责链模式的注意事项和细节
第1章 内容介绍和授课方法 1.1 Java设计模式内容介绍 1.1.1 先看几个经典的面试题 (1) 原型设计模式问题 1)请使用 UML 类图画出原型模式核心角色 要点:UML类图(描述类与类之间的关系);原型模式 2)原型设计模式的深拷贝和浅拷贝是什么,并写出深拷贝的两种方式的源码(重写 clone 方法实现深拷贝、使用序列化来实现深拷贝) 3)在 Spring 框架中哪里使用到原型模式,并对源码进行分析 beans.xml 答:Spring中原型 bean 的创建,就是原型模式的应用。代码分析+Debug 源码如下: (2) 设计模式的七大原则 要求: 1) 七大设计原则核心思想 2) 能够以类图的说明设计原则 3) 在项目实际开发中,你在哪里使用到了ocp 原则(开闭原则,在工厂模式里用到) 设计模式常用的七大原则有:单一职责原则、接口隔离原则、依赖倒转原则、里式替换 原则、开闭原则ocp、迪米特法则、合成复用原则(第7条在有的书上并没有给出) 类图如下:
(3) 金融借贷平台项目 下图是状态转换图:
(4) 解释器设计模式 1)介绍解释器设计模式是什么? 2)画出解释器设计模式的 UML 类图,分析设计模式中的各个角色是什么? 3)请说明 Spring 的框架中,哪里使用到了解释器设计模式,并做源码级别的分析
注:如果菱形是实心的,代表组合关系 Spring 框架中 SpelExpressionParser 就使用到解释器模式,代码分析+Debug 源码+模式 角色分析说明: (5) 单例设计模式 单例设计模式一共有几种实现方式?请分别用代码实现,并说明各个实现方式的优点和缺 点? 单例设计模式一共有 8 种写法,后面我们会依次讲到: 1) 饿汉式 两种 2) 懒汉式 三种 3) 双重检查:多线程开发时解决冲突问题,还可以保证懒加载(?) 4) 静态内部类:利用静态内部类的特点,既实现了多线程的并发问题,同时也解决了 懒加载的特点(在单例模式中用的也很多) 5) 枚举:经典的单例设计模式(推荐使用) 1.1.2 设计模式的重要性/应用场景
(1) 软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现) 的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在 1990 年代从建筑设计领域引入到计算机科学的。 (设计模式是为了让软件具有更好的复用性、扩展性、可读性、规范性和稳定性等等) (2) 大厦 VS 简易房 (3) 拿实际工作经历来说, 当一个项目开发完后,如果客户提出增新功能,怎么办?。 (可扩展性,使用设计模式,软件具有很好的扩展性) (4) 如果项目开发完后,原来程序员离职,你接手维护该项目怎么办? (维护性:主要体现在可读性、规范性) (5) 目前程序员门槛越来越高,一线 IT 公司(大厂),都会问你在实际项目中使用过什么 设计模式,怎样使用的,解决了什么问题。 (6) 设计模式在软件中哪里? 面向对象(oo) => (项目的)功能模块[设计模式+算法(数据结构)] => 框架[使用到多种 设计模式] => 架构 [服务器集群] (7) 如果想成为合格软件工程师,那就花时间来研究下设计模式是非常必要的. 1.2 课程亮点和授课模式 (1) 设计模式很有用,其实也很好玩,很像小时候搭积木,怎样搭建更加稳定,坚固 (2) 设计模式很重要,因为包含很多编程思想,还是有一定难度的,我们努力做到通俗易 懂(设计模式不仅仅是站在实现某个功能的角度来思考的,而是站在怎么让软件结构更合理 的角度) (3) 采用 提出一个应用场景->引出设计模式->剖析(设计模式的)原理->分析实现步骤 (图解)->代码实现-> 框架或项目源码分析(找到使用的地方) 的步骤讲解 [比如:以建造 者模式为例] A.提出一个实际需求:盖房问题 B.使用传统的方式来完成 C.传统的方式解决盖房问题分析,引出建造者模式 D.建造者模式原理分析 E.建造者模式原理结构图 F.建造者模式解决盖房问题思路分析+代码实现(尽量配类图)[对比] G.建造者模式在JDK、SSM的应用和源码分析 (4) 课程目标:让大家掌握本质 , 达能在工作中灵活运用解决实际问题和优化程序结构 的目的. 第2章 设计模式七大原则
2.1 设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用 性,灵活性 等多方面的挑战,设计模式是为了让程序(软件)具有更好的 1) 代码重用性 (即:相同功能的代码,不用多次编写) 2) 可读性 (即:编程规范性, 便于其他程序员的阅读和理解) 3) 可扩展性 (即:当需要增加新的功能时,非常的方便,也称为可维护性) 4) 可靠性 (即:当我们增加新的功能后,对原来的功能没有影响) 5) 使程序呈现高内聚,低耦合的特性。(即:模块内部是非常紧密的,但是模块与模 块之间/功能与功能之间的耦合性很低) 分享金句: 设计模式包含了面向对象的精髓,“懂了设计模式,你就懂了面向对象分析和设计 (OOA/D)的精要” Scott Mayers 在其巨著《Effective C++》就曾经说过:C++老手和 C++新手的区别就 是前者手背上有很多伤疤。 2.2 设计模式七大原则 设计模式原则,其实就是程序员在编程时应当遵守的原则,也是各种设计模式的基础 (即:设计模式为什么这样设计的依据)。 设计模式常用的七大原则有: (1)单一职责原则 (2)接口隔离原则 (3)依赖倒转(倒置)原则 (4)里式替换原则 (5)开闭原则 (6)迪米特法则 (7)合成复用原则 2.3 单一职责原则 2.3.1 基本介绍 对类来说的,即一个类应该只负责一项职责(注意:一项职责 != 只有一个方法)。 如类 A 负责两个不同职责:职责 1,职责 2。当职责 1 需求变更而改变 A 时,可能造成 职责 2 执行错误,所以需要将类 A 的粒度分解为 A1,A2。 2.3.2 应用实例 以交通工具案例讲解。 (1) 方案一 package com.principle.singleresponsibility; public class SingleResponsibility1 {
public static void main(String[] args) { Vehicle vehicle = new Vehicle(); vehicle.run("摩托车"); vehicle.run("汽车"); vehicle.run("飞机"); } } //交通工具类 //方案一:无论是哪种交通工具,run()方法都输出“在公路上运行”,这违反了单一 职责原则 //解决方案:根据交通工具运行的方法按不同,分解成不同的类 class Vehicle{ public void run(String vehicle) { System.out.println(vehicle+"在公路上运行..."); } } (2) 方案二 public class SingleResponsibility2 { public static void main(String[] args) { RoadVehicle roadvehicle = new RoadVehicle(); roadvehicle.run("摩托车"); roadvehicle.run("汽车"); AirVehicle airvehicle = new AirVehicle(); airvehicle.run("飞机"); } } //方案二的分析 //1.严格遵守了单一职责原则,但是这样做改动很大,即:将类分解的同时还要修改客 户端,成本太高 //2.改进:直接修改Vehicle类,改动的代码比较少 class RoadVehicle{ public void run(String vehicle) { System.out.println(vehicle + "在公路上运行..."); } } class AirVehicle{ public void run(String vehicle) { System.out.println(vehicle + "在天空中运行...");
} } class WaterVehicle{ public void run(String vehicle) { System.out.println(vehicle + "在水中运行..."); } } (3) 方案三 public class SingleResponsibility3 { public static void main(String[] args) { Vehicle2 vehicle2 = new Vehicle2(); vehicle2.run("摩托车"); vehicle2.runAir("飞机"); vehicle2.runWater("轮船"); } } //方案三的分析 //1.这种修改方法没有对原来的类(方法一)做大的修改,只是增加了方法 //2.虽然没有在类的级别上遵守单一职责原则,但是在方法级别上仍然遵守单一职责原 则 //后续在每个方法中可能还会有其他处理,注意,要慎用if..else..(用类来化解多分 枝) class Vehicle2{ public void run(String vehicle) { System.out.println(vehicle + "在公路上运行..."); } public void runAir(String vehicle) { System.out.println(vehicle + "在空中运行..."); } public void runWater(String vehicle) { System.out.println(vehicle + "在水中运行..."); } } 2.3.3 注意事项和细节 (1)降低类的复杂度,一个类只负责一项职责。 (2)提高类的可读性,可维护性
分享到:
收藏