设计模式

一、设计原则

       1、运用复用机制

       ①继承和对象组合面向对象系统中功能复用的两种最常用技术是类继承和对象组合,类继承允许你根据其他类的实现定义一个类的实现,这种通过生成子类的复用通常被称为白箱复用,“白箱”是相对可视性而言,在继承方式中,父类的内部细节对子类可见。对象组合是类继承之外的另一种复用选择,新的更复杂的功能通过组装或者组合对象来获得,对象组合要求被组合的对象具有良好定义的接口,这种复用风格被称为黑箱复用,因为对象的内部细节是不可见的。

       继承和组合各有优缺点,类继承是在编译时刻静态定义的,且可直接使用,因为程序设计语言直接支持类继承,类继承可以较方便地改变被复用的实现,其不足之处在于因为在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现(与组合比较,子类实现编译后就已确定,无法在运行时对其实现做出改变,而组合中接受的组合对象的接口,可以在运行时根据实际情况运行不同的该接口的实现),同时因为继承对子类揭示了其父类的实现细节,所以继承常被认为“破坏了封装性”。子类的实现与它的父类有紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,实现上的依赖性就会产生一些问题,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换,这种依赖关系限制了灵活性并最终限制了复用性,一个可用的解决方案就是只继承抽象类,因为抽象类提供较少的实现。对象组合是通过获得对其他对象的引用而在运动时刻动态定义的,组合要求对象遵守彼此的接口约定,进而要求更仔细的定义接口,而这些接口并不妨碍你将一个对象和其他对象一起使用。因为对象只能通过接口访问,所以我们并不破坏封装性,只要类型一致,运行时刻还可以用一个对象来替换另一个对象,更进一步,因为对象的实现是基于接口写的,所以实现上存在较少的依赖关系。对象组合对系统设计还有另一个作用,即优先使用对象组合有助于你保持每个类被封装,并被集中在单个任务上,这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物,另一方面,基于对象组合的设计会有更多的对象,且系统的行为将依赖对象间的关系而不是被定义在某个类中。

       ②委托:委托是一种组合方法,它使组合具有与继承同样的复用能力。在委托方式下,有两个对象参与处理一个请求,接受请求的对象将操作委托给它的代理者,这类似于子类将请求交给它的父类处理。举例来说,我们可以在窗口类中保存一个矩形类的实例变量来代理矩形类的特定操作,这样窗口类可以复用矩形类的操作,而不必像继承时那样定义成矩形类的子类。也就是说,一个窗口拥有一个矩形,而不是一个窗口就是一个矩形。窗口现在必须显式的将请求转发给它的矩形实例,而不是像以前它必须继承矩形的操作。

       委托的主要优点在于它便于运行时刻组合对象操作以及改变这些操作的组合方式。假定矩形对象和圆对象有相同的类型,我们只需简单的用圆对象替换矩形对象,则得到的窗口就是圆形的。

       ③参数化类型:参数化类型是一种并非严格的面向对象的功能复用技术,它允许你在定义一个类型时并不指定该类型所用到的其他所有类型(Java中的泛型)。

       2、优先使用对象组合,而不是类继承

二、设计模式

       1、创建型模式

       创建型模式抽象了实例化过程,他们帮助一个系统独立于如果创建、组合和表示它的那些对象,一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。

       ①抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

       使用场景:一个系统要独立于它的产品的创建、组合和表示时;一个系统要由多个产品系列的一个来配置时;当你要强调一系统相关的产品对象的设计以便进行联合使用时;当你提供一个产品类库,而只想显示它们的接口而不是实现是。

       ②Builder生成器:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

       使用场景:当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时;当构造过程必须允许被构建的对象有不同的表示时。

       ③工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。

       使用场景:当一个类不知道它所必须创建的对象的类的时候;当一个类希望由它的子类来指定它所创建的对象的时候;当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类的代理者这一信息局部化的时候。

        ④单例:保证一个类有且仅有一个实例,并提供一个访问它的全局访问点。

        使用场景:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时;当这个唯一实例应该是通过子类化可扩展的,并且客户应该无序更改代码就能使用一个扩展的实例时。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值