软件构造难点三——设计

最后一个我觉得最难的难点就在于在大题中的设计问题,往往会提示用各种各样的设计方案,很难记住,因此将它作为难点三,总结一下。

一.创建型模式

1.工厂方法模式

适用范围:当client不知道/不确定要创建哪个具体类的实例,或者不想在client代码中指 明要具体创建的实例时,用工厂方法

大概方法:定义一个用于创建对象的接口,让该接口的子类型来决定实例化哪一个类,从 而使一个类的实例化延迟到其子类

缺点:.每增加一种产品就需要增加一个新的工 厂子类

二.结构型模式

1.适配器模式

适用范围:解决类之间接口不兼容的问题

大概方法:将某个类/接口转换为client期望的其他形式,通过增加一个接口,将已存在 的子类封装起来,client面向接口编程,从而隐藏了具体子类

可用继承和委托两种方式实现

2.装饰器模式

适用范围:为对象增加不同侧面的特性

大概方法:对每一个特性构造子类,通过委派机制增加到对象上,以递归的方式实现

接口:定义装饰物执行的公共操作

起始对象,在其基础上增加功能(装饰),将通用的方法放 到此对象中

Decorator抽象类是所有装饰类的基类,里面包含的成员变量 component 指向了被装饰的对象

三.行为型模式

1.策略模式

适用范围:有多种不同的算法来实现同一个任务,但需要client根据需要 动态切换算法,而不是写死在代码里

大概方法:为不同的实现算 法构造抽象接口,利用delegation,运行时动态传入client倾向的算法 类实例

2.模板模式

共性的步骤在抽象类内公共实现,差 异化的步骤在各个子类中实现。模板方法定义了一个算法的步骤,并允许子 类为一个或多个步骤提供实现

3.迭代模式

适用范围:客户端希望对放入容器 /集合类的一组ADT对象进行遍历访问,而无需关心容器的具体类型 – 也就是说,不管对象被放进哪里,都应该提供同样的遍历方式

大概方法:让自己的集合类实现Iterable接口,并实现自己的 独特Iterator迭代器(hasNext, next, remove),允许客户端利用这 个迭代器进行显式或隐式的迭代遍历

4.visitor模式

适用范围:对特定类型object的特定操作(visit),在运行时将二 者动态绑定到一起,该操作可以灵活更改,无需更改被visit的类

大概方法:将数据和作用于数据上的某种/些特定操作分离开来,为ADT预留一个将来可扩展功能的“接入点”,外部实现的功能代码 可以在不改变ADT本身的情况下在需要时通过delegation接入ADT

之后有一些策略方法直接的比较:

1.Visitor vs Iterator

迭代器:以遍历的方式访问集合数据而无需暴露其内部表 示,将“遍历”这项功能delegate到外部的iterator对象

vositor:在特定ADT上执行某种特定操作,但该操作不 在ADT内部实现,而是delegate到独立的visitor对象,客户端可灵活 扩展/改变visitor的操作算法,而不影响ADT

2.Strategy vs Visitor

Visitor强调是的外部定义某种对ADT的操作,该操作于ADT自身关系 不大(只是访问ADT),故ADT内部只需要开放accept(visitor)即可,client 通过它设定visitor操作并在外部调用

Strategy则强调是对ADT内部某些要实现的功能的相应算法的灵活替换。 这些算法是ADT功能的重要组成部分,只不过是delegate到外部strategy类 而已

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值