Java--面向对象设计
【转载自本科老师上课课件】
问题一:
在一个软件的功能模块中,需要一种图像处理的功能。该图像处理的策略(如何处理)与图像的内容是相关的。如:卫星的运行图片,使用策略A处理方式,如果是卫星内云图片,则需要策略B处理方式。随时可向系统添加新的处理策略。处理时从GUI菜单下选择一种策略进行处理。 请使用Java设计出相应的程序。
【解决】
方法1:面向过程的传统方式
定义一个大的函数:
void strategy(int selection)
{
if(selection==1){
//按第一种选择的策略进行处理:处理代码
}
else if(selection==2){
//按第二种选择的策略进行处理:处理代码
}
…
else if(selection==n){
//按第n种选择的策略进行处理:处理代码
}
}
客户端调用代码:
根据GUI下拉菜单的选择项,调用:strategy(n)
方法2:面向对象的传统方式
定义一个类,包含所有的策略:
public class Strategy{
public static void strategy1()
{
//策略1的处理代码
}
public static void strategy2()
{
//策略2的处理代码
}
//…
public static void strategyn()
{
//策略n的处理代码
}
}
客户端调用代码:
根据GUI下拉菜单的选择项,调用相应的策略代码: Strategy. strategyn()
方法3:接口的设计方案 !!!
(1)定义一个接口:Strategy
public interface Strategy{
public void strategy();//策略处理代码
}
(2)随时添加新策略:就是随时实现该接口!(不需要修改已打包封装好的原始的类库包)这是一种纯增量式代码的修改添加
public class NewAddStrategy implement Strategy
{
public void strategy(){
//新策略的处理代码
}
}
(3)客户端代码:针对接口进行软件设计
public class Client
{
Strategy strategy;
//调用方式:
//strategy. strategy();
}
(4)关系图
问题二:
手机等设备中,对于如蓝牙设备,在整个系统中只需要一个对象表达它。如何控制系统,确保只生成一个对象呢?
【解决】
思路:
1)构造器隐藏起来。即private
2)定义唯一的一个private static 成员保存它。
3)开放一个public static 方法,获取唯一的那个对象。
设计结果----单例模式 !
public class BLDev
{
private static BLDev obj=new BLDev();
private void BLDev(){
//蓝牙设备初始代代码
}
public static BLDev getDefaultBLDev()
{
return obj;
}
}
//使用方法:在需要BLDev对象的地方:
BLDev bl=BLDev.getDefaultBLDev();
问题三:
有一个整点报时的服务,每当整点时,向需要整点报时服务的其它对象发出整点通知。整点报时服务在整个系统中只需要一个即可(不允许产生多个)。
【解决】
- 设计思考:服务者与需要服务的对象之间:
- 对象需要服务。如何表达这一点?
- 只有对象自己才能知道,它需不需要服务。故:让对象自己向服务提供者表达:我需要服务。即:服务提供者应该提供一个手段,让其它对象向它表达“我需要服务”。即:注册。因而:void register(需要服务的对象)
- 对象不再需要服务。如何表达这一点?
- 只有对象自己才能知道,它不再需要服务。 故:让对象自己向服务提供者表达:我不再需要服务了。 即:服务提供者应该提供一个手段,让其它对象向它表达“我不再需要服务了”。即:删除注册。 因而:void unregister(不再需要服务的对象)
- 发出通知。如何设计?
- 当整点到时,服务应该向所有需要服务的那些对象,发出通知。 因此:服务应该有一个手段,向所有的注册者发出通知。 因而:设计一个方法,通知这些对象。 void notifies()
- 对象怎样得到通知,然后可处理相应逻辑。如何设计?
- 生活中,得到通知的方式:打电话+(通知内容)?EMAIL +(通知内容)?QQ +(通知内容)?.... 故:每一个要得到通知的对象,必须提供一个方法,由服务提供方去自动调用,并且传入相应的通知内容。 如何保证:1)每一个要得到通知的对象,提供的方法,其名字、参数、返回值等保持一致?2)而且必须要提供此方法?(约束),否则得不到通知?
- 这引导我们自然而然地作出设计:这正是接口。
故:设计决策:设计出一个接口,只有实现该接口的类的对象,才能有资格得到通知【 因为:保证:1)每一个要得到通知的对象,提供的方法,其名字、参数、返回值等保持一致?2)而且必须要提供此方法?(约束),否则得不到通知?】 - 接口:TimeListener
方法: 用于得到通知
方法名:service
传入参数:整点时间数据及其它数据(如:发生的上下文等)。
故:设计时,抽象出类:TimeEvent来表达它。
结果:void service(TimeEvent e)
- 整点报时服务规范化、标准化,适用更多的具有服务特性的对象。如何设计?
- 观察发现:几乎所有的服务都应该具有这样的特性:注册、解注册、发出通知。而整点报时服务,也具有这个特性。 具有。。。特性,暗示我们:将这样的特性抽象成:抽象类?还是接口?
- 还是接口
每一个服务应该具有的特性:
public interface Serviceable
{
void register(TimeListener tl);
void unregister(TimeListener tl);
void notifies();
} - 提供整点报时的Service自然具有Serviceable特性
故:
public class TimeService
implements Serviceable
{
//略
} 
- 只能产生一个对象。如何设计?其它考虑。
- 分析:
1)构造器隐藏。
2)提供一个public static 方法,只能通过该方法,才能获取该对象。 - 代码设计
public class TimeService
implements TimeListener
{
//…
private TimeService(){}
private static TimeService ts=new TimeService();
public static TimeService getTimeService()
{
return ts;
}
}
- 分析:
- 对象需要服务。如何表达这一点?
Java--面向对象设计的更多相关文章
- 《Java面向对象设计》
<Java面向对象设计> 第一章 面向对象软件工程与UML p理解为什么需要软件工程 p掌握软件工程的基本概念 p掌握软件生命周期各个阶段的主要任务 p了解流行软件开发过程 p了解软件过程 ...
- Java面向对象设计主要有三大特征:封装性、继承性和多态性
Java面向对象设计主要有三大特征:封装性.继承性和多态性 一 封装性 1.1 概念:它是将类的一些敏感信息隐藏在类的类部,不让外界直接访问到,但是可以通过getter/setter方法间接访 ...
- java面向对象设计原则
原则1:DRY(Don't repeat yourself) 即不要写重复的代码,而是用"abstraction"类来抽象公有的东西.如果你需要多次用到一个硬编码值,那么可以设为公 ...
- JAVA面向对象设计中类关系
现在看以前描述有点小问题:类之间关系分为继承.泛化.依赖.关联.聚合.聚合关系几种.继承是is a关系,泛化(类实现接口)表示like a关系. 类之间的关系种类: Generalization(泛化 ...
- Java面向对象设计题2
有感于很多新人都不知道怎么学习软件开发,个人感觉还是因为练习做的太少,软件开发知识想看懂太难了,必须是边读资料边动手练习.莫说是新人,Java老人研究新技术的时候也是边读资料边练习.因此整理和编排了一 ...
- Java面向对象设计
1.少了程序入口会在输出的地方报这个错: Syntax error, insert "... VariableDeclaratorId" to complete FormalPar ...
- 2016-2017-2 20155338 实验二《Java面向对象程序设计》实验报告
2016-2017-2 20155338 实验二<Java面向对象程序设计>实验报告 实验内容: 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握 ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- (转)Java程序员应该了解的10个面向对象设计原则
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...
- Java程序员应当知道的10个面向对象设计原则
面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式,而没有把足够多的注 ...
随机推荐
- Linux查看RAM内存信息
1.查看/proc/meminfo文件 查看RAM使用情况最简单的方法是通过/proc/meminfo. 这个动态更新的虚拟文件列出了详细的内存使用情况. cat /proc/meminfo 命令输出 ...
- Windows实现桌面录屏、指定窗口录制直播,低延时,H5页面播放
接着前面记录的3种方式实现桌面推流直播: 1.Windows 11实现录屏直播,搭建Nginx的rtmp服务 的方式需要依赖与Flash插件,使用场景有限 2.Windows 11实现直播,VLC超简 ...
- 关于一类容斥原理设计 dp 状态的探讨
写在前面 为什么要写?因为自己学不明白希望日后能掌握. 大体思路大概是 设计一个容斥的方案,并使其贡献可以便于计算. 得出 dp 状态,然后优化以得出答案. 下列所有类似 \([l,r]\) 这样的都 ...
- 图解MySQL:count(*) 、count(1) 、count(主键字段)、count(字段)哪个性能最好?
大家好,我是小林. 当我们对一张数据表中的记录进行统计的时候,习惯都会使用 count 函数来统计,但是 count 函数传入的参数有很多种,比如 count(1).count(*).count(字段 ...
- CSS基础 常见的元素显示模式
1.块级元素 属性:display:block 特点:1.一行只能显示一个元素 2.宽度默认是父元素的,高度是有内容撑开 3.可以设置宽.高常见块元素:div,p,h系列,ul.li,dl.dt.dd ...
- 初识python 之 cx_oracle
使用cx_oracle操作oracle数据库 oracleClient 包 #!/user/bin env python # author:Simple-Sir # create_time: 2021 ...
- spring boot 解决 跨域 的两种方法 -- 前后端分离
1.前言 以前做项目 ,基本上是使用 MVC 模式 ,使得视图与模型绑定 ,前后端地址与端口都一样 , 但是现在有些需求 ,需要暴露给外网访问 ,那么这就出现了个跨域问题 ,与同源原则冲突, 造成访问 ...
- day4 对偶数、偶数位的操作
1.函数fun()的功能:从低位开始取出整形变量s中偶数位上的数,依次构成一个新数放在t中.高位仍在高位. 效果理想:但是经测试的时候出现了错误 输入987654321时,打印出来的却是18681.经 ...
- GUI系统
通常情况下,一般使用QT来制作Linux系统的GUI,但是由于我们团队对于游戏有着狂热的热爱,以及有游戏的相关开发经验. 在做过ROS与Arduino通信,Unity3d与Arduino通信后,我感觉 ...
- CMake语法—普通变量与包含、宏(Normal Variable And Include、Macro)
目录 CMake语法-普通变量与包含.宏(Normal Variable And Include.Macro) 1 CMake普通变量与包含.宏示例 1.1 代码目录结构 1.2 根目录CMakeLi ...
