【转载自本科老师上课课件】

问题一:

  在一个软件的功能模块中,需要一种图像处理的功能。该图像处理的策略(如何处理)与图像的内容是相关的。如:卫星的运行图片,使用策略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--面向对象设计的更多相关文章

  1. 《Java面向对象设计》

    <Java面向对象设计> 第一章 面向对象软件工程与UML p理解为什么需要软件工程 p掌握软件工程的基本概念 p掌握软件生命周期各个阶段的主要任务 p了解流行软件开发过程 p了解软件过程 ...

  2. Java面向对象设计主要有三大特征:封装性、继承性和多态性

    Java面向对象设计主要有三大特征:封装性.继承性和多态性 一  封装性   1.1  概念:它是将类的一些敏感信息隐藏在类的类部,不让外界直接访问到,但是可以通过getter/setter方法间接访 ...

  3. java面向对象设计原则

    原则1:DRY(Don't repeat yourself) 即不要写重复的代码,而是用"abstraction"类来抽象公有的东西.如果你需要多次用到一个硬编码值,那么可以设为公 ...

  4. JAVA面向对象设计中类关系

    现在看以前描述有点小问题:类之间关系分为继承.泛化.依赖.关联.聚合.聚合关系几种.继承是is a关系,泛化(类实现接口)表示like a关系. 类之间的关系种类: Generalization(泛化 ...

  5. Java面向对象设计题2

    有感于很多新人都不知道怎么学习软件开发,个人感觉还是因为练习做的太少,软件开发知识想看懂太难了,必须是边读资料边动手练习.莫说是新人,Java老人研究新技术的时候也是边读资料边练习.因此整理和编排了一 ...

  6. Java面向对象设计

    1.少了程序入口会在输出的地方报这个错: Syntax error, insert "... VariableDeclaratorId" to complete FormalPar ...

  7. 2016-2017-2 20155338 实验二《Java面向对象程序设计》实验报告

    2016-2017-2 20155338 实验二<Java面向对象程序设计>实验报告 实验内容: 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握 ...

  8. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  9. (转)Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  10. Java程序员应当知道的10个面向对象设计原则

    面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式,而没有把足够多的注 ...

随机推荐

  1. Oracle对表空间、用户、用户权限的操作

    一.对表空间的操作 1.创建表空间(create tablespace) -- 'hpdb_tablespace' 指定表空间名称 -- 'e:\hpdb.dbf' 指定表空间数据文件名称 -- si ...

  2. 浅议像素化与体素化Part.1——平面图形像素化

    什么是像素化 学计算机的人往往都比较清楚图形和图像的区别,而且往往能够从数据结构的角度理解这两者的区别,一般来说,图形是由几何空间中的基本图元所组成,表现为用外部轮廓线条勾勒成的矢量图.例如由计算机绘 ...

  3. mysql语句1-创建库和表

    一.DDL数据定义语言 就是对书库内部的对象进行创建.删除.修改等操作的语言. 关键字:create  drop  alter 1.连接数据库 mysql -u用户名 -p -h指定主机(不指定默认是 ...

  4. 初识python:格式化输出

    使用input函数输入用户值,再使用三种方法格式化输出. #!/user/bin env python # author:Simple-Sir # 20180831 # 格式化输出: name = i ...

  5. 禁止yum update 自动更新系统内核

    使用yum update更新系统软件时,禁止升级内核,可以防止产生因不兼容导致的未知错误. 设置前请先备份原设置文件yum.conf cp /etc/yum.conf    /etc/yum.conf ...

  6. SYCOJ1793

    题目-统计单词前缀数 (shiyancang.cn) 1 #include<bits/stdc++.h> 2 using namespace std; 3 map<string,in ...

  7. HDU 2041 超级楼梯 (斐波那契数列 & 简单DP)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2041 题目分析:题目是真的水,不难发现规律涉及斐波那契数列,就直接上代码吧. 代码如下: #inclu ...

  8. [流畅的Python]第一章数据模型

    这些来自同一家出版社的动物书 像是计算机科学界一盏盏指路明灯 余幼时 初试读 学浅 以为之晦涩难懂 像是老学究咬文嚼字 现在看起来还有些有趣 其实理工男大多都很有趣 这一章介绍了 怎么样去视线一个带有 ...

  9. GeoServer介绍

    GeoServer本质上是一个地图服务器,它是遵循OpenGIS Web 服务器规范的J2EE实现,通过它可以方便的将地图数据发布为地图服务,实现地理空间数据在用户之间的共享.另外,它也提供了相应的接 ...

  10. Java集合-LinkedList源码分析

    目录 1.数据结构-链表 2.ArrayList结构特性 3.构造方法 4.成员变量 5.常用的成员方法 6.Node节点 7.序列化原理 8.迭代器 9.总结 1.数据结构-链表 链表(Linked ...