0808300034面向对象程序设计的基本原则和设计模式.docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《0808300034面向对象程序设计的基本原则和设计模式.docx》由会员分享,可在线阅读,更多相关《0808300034面向对象程序设计的基本原则和设计模式.docx(22页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、0808300034面向对象程序设计的基本原则和设计模式 目录 内容摘要 (2) 1、面向对象的几个基本原则 1、1面向抽象原则 (2) 1、2开闭原则 (4) 1、3多用组合少用继承原则 (6) 1、4高内聚低耦合原则 (6) 2、几个重要的设计模式 2、1策略模式 (7) 2、2中介者模式 (11) 2、3模板方法模式 (15) 3、总结 (18) 4、参考文献 (19) 面向对象程序设计的几个基本原则和设计模式 内容摘要 本文重点介绍了面向对象程序设计的几个基本原则(面向抽象原则、开闭原则、多用组合少用继承原则)和设计模式(策略模式、中介者模式、模板方法模式),具体给出了其设计思想、结构
2、,并结合实例予以详细说明。 关键词:面向对象基本原则设计模式 一个好的设计系统往往是易维护、易扩展、易复用的,面向对象的基本原则有助于知道如何使用面向对象语言编写出易维护、易扩展、易复用的程序代码,设计模式也正是从优秀的设计系统中总结出的设计精髓,并且充分体现了其基本原则,对提高程序员的设计能力也非常有帮助。需要强调的一点是,本文所介绍的这些原则、及设计模式是在许多设计中总结出的指导性原则,并不是任何设计都必须要遵守的“法律”规定。 1、面向对象的几个基本原则 1.1面向抽象原则 : 所谓面向抽象编程,是指当设计一个类时,不让该类面向具体的类,而是面向抽象类或者接口,即所设计类中的重要数据时抽
3、象类或接口声明的变量,而不是具体类声明的变量。: 例如,已经有了一个Circle类,该类创建的对象circle调用getArea()方法可以计算圆的面积。Circle类的代码如下: public class Circle double r; Circle(double r) this.r=r; public double getArea() return(3.14*r*r); 现在要设计一个Pillar类(柱类),该类的对象调用getVolum()方法可以计算主题的体积。Pillar类的代码如下: public class Pillar Geometry bottom; double heig
4、ht; Pillar (Circle bottom,double height) this.bottom=bottom; this.height=height; public double getV olume() return bottom.getArea()*height; 上述Pillar类中,Bottom是用具体类Circle声明的变量,如果不涉及用户需求的变化,上面Pillar类的设计没有什么不妥,但是在某个时候,用户希望Pillar类能创建出底是三角形的柱体。显然上述Pillar类无法创建出这样的柱体,即上述设计的Pillar类不能应对用户的这种需求。 现在重新来设计Pillar类
5、。首先,注意到柱体计算体积的关键上述计算出底面积,一个柱体在计算底面积时不应该关系它的底是怎样形状的具体图形,应该只关心这种图形是否具有计算面积的方法。因此,在设计Pillar类时不应当让它的底是某个具体类声明的变量,一旦这样做,Pillar类就依赖该具体类,缺乏弹性,难以应对需求的变化。 下面将面向抽象重新设计Pillar类。首先编写一个抽象类Geometry(或接口),该抽象类(接口)中定义了一个抽象的getArea()方法。Geometry类如下: public abstract class Geometry /如果使用接口需用interface来定义Geometry。 public a
6、bstract double getArea(); 现在Pillar类的设计者可以面向Geometry类编写代码,即Pillar类应当把Geometry对象作为自己的成员,该成员可以调用Geometry的子类重写的getArea()方法。这样一来,Pillar 类就可以将计算底面积的任务指派给实现Geometry类的子类的实例。 一下Pillar类的设计不再依赖具体类,而是面向Geometry类,即Pillar类中的bottom 是用抽象类Geometry声明的变量,而不是具体类声明的变量。重新设计的Pillar类的代码如下: public class Pillar Geometry bott
7、om; /bottom是抽象类Geometry声明的变量 double height; Pillar (Geometry bottom,double height) this.bottom=bottom; this.height=height; public double getV olume() return bottom.getArea()*height; /bottom可以调用子类重写的getArea方法 下列Circle和Rectange类都是Geometry的子类,二者都必须重写Geometry类的getArea()方法来计算各自的面积。 public class Circle ex
8、tends Geometry double r; Circle(double r) this.r=r; public double getArea() return(3.14*r*r); 现在就可以用Pillar类创建出具有矩形底火圆形底的柱体了,如下列Application.java所示: Application.java public class Application public static void main(String args) Pillar pillar; Geometry bottom; bottom=new Rectangle(12,22,100); pillar =n
9、ew Pillar (bottom,58); /pillar是具有矩形底的柱体 System.out.println(矩形底的柱体的体积+pillar.getV olume(); bottom=new Circle(10); pillar =new Pillar (bottom,58); /pillar是具有圆形底的柱体 System.out.println(圆形底的柱体的体积+pillar.getV olume(); UML类图1-1: UML类图1-1 : 结合上述实例,通过面向抽象类设计Pillar类,使得该Pillar类不在依赖具体类,因此每当系统增加新的Geometry的子类时,比如
10、增加一个Triangle子类,那么不需要修改Pillar 类的任何代码,就可以使用Pillar创建出具有三角形底的柱体。 1.2开闭原则 : 所谓“开闭原则(OpenClosed Principle)”,就是让设计应当对扩展开放,对修改关闭。再给出一个设计时,应当首先考虑到用户需求的变化,将应对用户变化的部分设计为对扩展开放,而设计的核心部分是经过精心考虑之后确定下来的基本结构,这部分应当是对修 改关闭的,即不能因为用户的需求变化而再发生变化。 : 下面的例子中,准备设计一个广告牌,希望所设计的广告牌可以展示许多公司的广告词。运行结果如图1-2 public interface Adverti
11、sement public void showAdvertisement(); public String getCorpName(); public class AdvertisementBoard public void show(Advertisement adver) System.out.println(广告牌显示+adver.getCorpName()+公司的广告词:); adver.showAdvertisement(); public class PhilipsCorp implements Advertisement /PhilipsCorp实现Avertisement接口
12、public void showAdvertisement() System.out.println(); System.out.println(没有最好,只有更好); System.out.println(); public String getCorpName() return 飞利普 ; public class LenovoCorp implements Advertisement /LenovoCorp实现Avertisement 接口 public void showAdvertisement() System.out.println(*); System.out.println(
13、让世界变得很小); System.out.println(*); public String getCorpName() return 联想集团 ; public class Example public static void main(String args) AdvertisementBoard board = new AdvertisementBoard(); board.show(new PhilipsCorp(); board.show(new LenovoCorp(); 运行结果图1-2 在例题中,如果再增加一个Java源文件(对扩展开放),该源文件有一个实现Advertisem
14、ent接口的类IBMCorp,那么AdvertisementBoard类不需要做任何修改(对AdvertisementBoard类的修改关闭),应用程序的主类就可以使用代码: Board.show(new IBMCorp(); 显示IBM公司的广告词。 如果将例题中的Advertisement,接口、AdvertisementBoard类以及LenovoCorp和PhilipsCorp类看作是一个小的开发框架,将例题看做是用户程序,那么框架满足“开闭原则”,该框架相对用户的需求就比较容易维护,因为当用户程序需要使用广告牌现实IBMCorp 公司的广告词时,只需要简单地扩展框架,即在框架中增加一
15、个实现Advertisement接口的IBMCorp类,而无须修改框架中的其他类。 : 如果一个程序设计遵守了“开闭原则”,那么这个设计一定是易维护的,因为在设计中增加新的模块时,不必修改设计中的核心模块。通常无法让设计的每个部分都遵守“开闭原则”,甚至不应当这样去做,应当把主要精力集中在应对设计中最有可能因需求变化而需要改变的地方,然后想办法应用“开闭原则”。 当设计某些系统时,经常需要面向抽象来考虑系统的总体设计,不要考虑具体类,这样就容易设计出满足“开闭原则”的系统。在程序设计好后,首先对abstract类的修改关闭,否则,一旦修改abstract类,将可能导致它的所有子类都需要做出修改
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 0808300034 面向 对象 程序设计 基本原则 设计 模式
![提示](https://www.deliwenku.com/images/bang_tan.gif)
限制150内