Java--面向对象设计

博客 分享
0 242
优雅殿下
优雅殿下 2022-02-11 00:55:12
悬赏:0 积分 收藏

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 TimeServiceimplements TimeListener{    //    private TimeService(){}    private static TimeService ts=new TimeService();    public static TimeService  getTimeService()   {         return ts;    }}
posted @ 2022-02-10 23:31 Si_wuxie 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    优雅殿下

    优雅殿下 (王者 段位)

    2018 积分 (2)粉丝 (47)源码

    小小码农,大大世界

     

    温馨提示

    亦奇源码

    最新会员