软件构造——面向可维护的设计模式

1.创建模式
  这些类的作用主要就是为了创建对象,对应采取的模式就是不同的创建模式,分为以下几种模式。

A.工厂方法模式
  使用ADT的时候,如果我们想创建一个对象,我们就要调用构造函数,而构造函数不会在接口中而是在实现类中,因此抽象程度降低了,而且导致用户可能会依赖于这个实现类的实现方式,而不是接口。为了解决这些,工厂模式应运而生。
  我们也可以说其实就是对构造函数的包装(就像之前对其他字段或方法的包装一样),包装到一个新的类中,从而实现隐藏了这个原始类的类名,新的类一般只有一个方法,那就是用来构造原有类的对象。
  另外还有一种实现的结果相同的方法,就是在原始的类中添加静态工厂方法,同时将构造方法设置为私有。


B.抽象工厂模式
  相比于普通的工厂方法模式中,一个工厂就用于创造一个类的对象,其实抽象方法模式就是变成了一个工厂可以创建一组类的对象,不过创建的搭配是固定好的。
  我们可以举下列在麦当劳点餐的例子来大致说明:
  对于普通的,没有使用创造模式的情况,我们就是这样点:一个奥尔良鸡腿堡,一个中可乐。我们提出需求时就直接是知道了具体的类,比如是奥尔良鸡腿堡,而不是通过它的父类“汉堡”。
  而工厂方法模式,我们是这样点:有一个个优惠卷,每个卷有对应的产品。我们给服务员这些卷,让他们拿出对应的产品,而我们不再需要知道这些产品的名字。通过优惠卷信息的不同,通过不同的工厂去创造对应的对象。
  而抽象工厂模式,我们是这样点:有一个个优惠卷,里面都是一个套餐。我们同样不用知道这些套餐中任何一个产品的名字,但是这些产品是绑定在这一个套餐之内的了,我们不再能一个个产品的去点,但是这样我们创建的时候对固定的模式更方便。

2.结构模式
  通过改变类之间的结构,让类呈现新的功能。

A.代理模式
  有的时候我们在创建一个类的对象时,就要进行一定的操作,而有的时候这个操作很费时间,而操作不一定必须,则此时我们就可以创建一个对应的包装,来实现将所谓的这个操作和对象的创建分隔开。
  下面是一个很好的例子。
  首先这张图说明在创建这个图片的时候,就调用了loadfromDisk这个需要花费很多时间的操作。

  如果我们想要实现仅仅是创建一个对象而不是立刻执行加载操作,则可以执行如下操作:创建一个虚拟的了类,构造方法中不再有display而是挪到了外面,通过委托的机制进行调用。


  代理模式与适配器模式的区别:前者的目的是解决私密问题和耗费过大的问题,而后者的目的主要是消除不匹配,让客户端和内部的类以统一的方式建立联系。

3.行为模式
  行为性模式主要用于描述类或对象的交互以及职责分配。

A.观察者模式
  总的来说就是一种一对多,类似于广播的模式。
  在被观察者中,应该有添加观察者和删除观察者的操作(用于将观察者与被观察者之间建立联系),还有就是将信息通知给观察者的操作(notify)。对于观察者,也该有更新状态的操作(当然是由被观察者的notify来操作)
  例子如下所示,观察者即为被观察者中的一个列表。通过调用观察者的update操作来实现notify操作。(当然这里不能删除被观察者)

  粉丝(被观察者)的例子如下,subject属性代表着对应的被观察者所观察的观察者。

  当然,java中提供了Observer接口和Observable抽象类,类似于迭代器模式。

B.访问者模式
  总的来说,访问者模式就是,被访问者中的某个具体的操作,因为各种原因,去委托给另外的类进行完成。委托给的类就是访问者。
  我们还是用例子来说明,不然太抽象。
  首先这是第一棵继承树,是被访问的那个类。其中要有accept方法,参数是访问类的对象,通过accept方法来让其访问。

  而第二棵继承树就是访问类了。其中要有visit方法,通过多态实现取分访问不同类型的对象从而有多种实现,而实现中即可以正常的写业务逻辑了。这个例子相当于把每种物品的计算价格的操作委托给了另一个类,这也就是访问者模式最主要的目的。

  与迭代器模式的区别:迭代器模式主要是进行一个个的访问,而访问者模式主要是被访问者将对应的某种功能的实现交给访问者,客户端可以灵活的改变访问者中的操作算法。

4.设计模式总结
  虽然设计模式种类很多,但是抽象出的类与类之间的关联效果,都是如下两张图所示。
  首先是单一继承树的情况。

  其次是两颗继承树的情况。

  至于如何去取分这些样式相同的模式,主要是通过它里面方法的不同,就类似于大家都是人,但是由于自身能做的事情不同,因此有不同的职业一样。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值