java设计模式 课后习题参考答案 第 2 章 面向对象设计原则 清华出版社 刘伟

第 2 章 面向对象设计原则

  1. B A C D D C

  2. C

  3. D

  4. D

  5. “封装变化点”可对应“开闭原则”,“对接口进行编程”可对应“依赖倒转原则”,“多使用组合,
    而不是继承”可对应“合成复用原则”。

  6. 类的粒度需满足单一职责原则,接口的粒度需满足接口隔离原则。

  7. 在面向对象设计中,正方形不能作为长方形的子类,具体分析过程如下:

class Rectangle //长方形
{
private double width;
private double height;
public Rectangle(double width,double height)
{
this.width=width;
this.height=height;
}
public double getHeight()
{
return height;
}
public void setHeight(double height)
{
this.height = height;
}
public double getWidth()
{
return width;
}
public void setWidth(double width)
{
this.width = width;
5
}
}
class Square extends Rectangle //正方形
{
public Square(double size)
{
super(size,size);
}
public void setHeight(double height)
{
super.setHeight(height);
super.setWidth(height);
}
public void setWidth(double width)
{
super.setHeight(width);
super.setWidth(width);
}
}
class Client
{
public static void main(String args[])
{
Rectangle r;
r = new Square(0.0);
r.setWidth(5.0);
r.setWidth(10.00);
double area = calculateArea(r);
if(50.00==area)
{
System.out.println("这是长方形或长方形的子类!");
}
else
{
System.out.println("这不是长方形!");
}
}
public static double calculateArea(Rectangle r)
{
return r.getHeight() * r.getWidth();
}
}

由代码输出可以得知,我们在客户端代码中使用长方形类来定义正方形对象,将输出“这
不是长方形!”,即将正方形作为长方形的子类,在使用正方形替换长方形之后正方形已经
不再是长方形,接受基类对象的地方接受子类对象时出现问题,违反了里氏代换原则,因此
从面向对象的角度分析,正方形不是长方形的子类,它们都可以作为四边形类的子类。关于
该问题的进一步讨论,大家可以参考其他相关资料,如 Bertrand Meyer 的基于契约设计
(Design By Contract),在长方形的契约(Contract)中,长方形的长和宽是可以独立变化的,但是正方形破坏了该契约。

  1. 重构方案如下所示:
    在这里插入图片描述

在本重构方案中,将笔的大小和颜色设计为两个继承结构,两者可以独立变化,根据依
赖倒转原则,建立一个抽象的关联关系,将颜色对象注入到画笔中;再根据合成复用原则,
画笔在保持原有方法的同时还可以调用颜色类的方法,保持原有性质不变。如果需要增加一
种新的画笔或增加一种新的颜色,只需对应增加一个具体类即可,且客户端可以针对高层类
Pen 和 Color 编程,在运行时再注入具体的子类对象,系统具有良好的可扩展性,满足开闭
原则。(注:本重构方案即为 桥接模式)

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本书以作者多年来为软件开发人员(包括面向对象技术老兵和新手)讲授模式的经验为基础撰写而成,首先概述了模式的基础知识,以及面向对象分析和设计在当代软件开发中的重要性。随后,使用易懂的示例代码阐明了许多当今最有用的模式,包括它们的基础概念、优点、权衡取舍、实现技术以及需要避免的缺陷,使读者能够理解模式后面的基本原则和动机,理解为什么它们会这样运作。 本书适用于软件开发专业人士,以及计算机专业、软件工程专业的高校师生,也可作为面向对象分析与设计课程的教材。 本书是最简洁、清晰、实用的设计模式著作,应用最新的Java示例,为程序员和架构师提供了使用模式进行设计、开发和交付软件的方法。 本书以作者多年来为软件开发人员讲授模式的经验为基础撰写而成。其经验已经证明,如果能够理解模式后面的基本原则和动机,理解为什么它们会这样运作,那么将有助于你加速学习模式的进程。 阅读本书,读者能够完整地理解12个核心的设计模式和1个分析模式,了解设计模式并不是孤立存在的,多个设计模式协同工作才能创建出更加坚固的应用程序。这里所讲授的12个模式并没有涵盖所有应该学会的模式,但是理解了这12个模式,你将能够举一反三,更加容易地自学其他模式。 设计模式最佳入门图书,2003JOLT大奖读者选择奖得主。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值