《On Java进阶卷》阅读笔记(六)

第8章 设计模式

模式的基本概念可以看作是程序设计的基本概念:增加一层抽象。如果你要抽象某个事物,实际上即使在隔离某个特定的细节。通常的表述是:将变化的事物和不会变化的事物分开。

最困难的是如何发现变化的事物,找到后才能用模式进行隔离。

模式并不是必须的,如果使用这种模式会消耗更多的精力,那么你对该技术的需求程度可能并不足以证明提供语言级支持是合理的。

单例模式:一种仅会提供唯一一个对象实例的方法。

设计模式被分为如下几类:

  1. 创建类,即创建对象的方式,例如单例模式、工厂模式等;
  2. 结构类,即如何设计满足特定项目约束的对象,围绕这些对象和其他对象间的关联关系,保证系统的变化不会导致这些关联方式的变化。
  3. 行为类:指处理程序中特定类型操作的对象。这些对象封装了要执行的流程,例如解释某种语言,满足某个请求。例如观察者模式和访问者模式。

模板方法模式:通常是隐藏的,并通过调用各种基类方法来驱动该应用程序,我们可以重写这些基类方法来创建应用程序。模板方法通常被定义在基类中,并且无法被改变。所有的子类执行逻辑中会有包含执行此模板方法的地方。这属于共用的方法。

封装实现:需要引入一个代理类,让代理类封装了实际执行工作的实现类。当在代理中调用一个方法时,它会转而调用实现类中的某个方法。例如代理模式、状态模式和使用状态模式的状态机。

代理模式和状态模式的区别在于:代理模式只有一个实现,而状态模式有多个实现;代理模式用来控制对自身实现的访问,而状态模式则可以让我们动态地改变实现。

只要你实现了一个对象——它可以被转发调用给成员对象,并且该成员对象可以被动态地替换——就认为是在使用状态模式。

代理模式和状态模式相同点:都存在一个代理来将方法调用传递给某个实现对象。

状态机模式通过一种强加的结构来自动改变具体实现。具体的实现表示系统的当前状态。在不同的状态下,系统有着不同的行为,这是因为它的内部包含状态模式。将系统从一种状态改变为另一种状态的代码通常使用模板模式。

工厂模式:强制通过某个公共节点来创建对象,以防止用于创建的代码在系统中四处扩散。系统中的所有代码都必须通过该工厂创建某个对象。这样在向系统增加新类的时候,只需修改工厂即可。

函数对象模式:封装一个方法,目的是将函数的选择和调用函数的位置解耦。

  • 命令模式:一个身为对象的方法,将一个函数对象作为参数传递,它便会产生不同的行为。用于解决一类特定的问题,所调用的方法体即保持不变的事物,而变化的部分则被隔离在命令对象中。
  • 策略模式:与命令模式类型,都是从一个基类继承出来的一组函数对象。包含一段可作为代理类的上下文,该代理类用于控制文件的选择以及对特定策略对象的使用。
  • 职责链模式:大概可以被看作用策略对象实现的动态泛化版本的递归。先产生一个调用,然后一系列策略逐个尝试处理该调用。中途有成功或者等到全部不成功时,过程结束。而职责链模式中,一个方法回调用相同基类的方法的不同实现,后者又会调用该基类方法的另一个实现,以此类推,直到满足终结条件。职责链是高效的链表结构,因此可以动态地进行创建或修改。

改变接口:

  • 适配器模式:接收一种类型为参数,并生成面向另一种类型的接口;在有了A但是想要B的时候。
  • 外观模式:可以创建一个面向一组类的接口,这只是提供了一种更为简便的方式,来处理一个库或一批资源。把丑陋的逻辑隐藏在对象里。不让外部的调用者看到这一组类之间的交互。

回调:可以将代码和行为解耦。

  • 观察者模式:解决一组对象必须在某些其他对象改变状态时更新自身。它拥有一个钩子,我们可以在此处改变代码,在其他对象改变后触发此钩子。Java自身有个Observer接口和Observable类。Observable类会跟踪每个希望在变更时得到通知的Observer。当发生任何应该让每个Observer更新自身的变更时,Observable会调用自身的notifyObservers方法,该方法会调用每个Observer上的update方法。

多路分发(一般是双路分发,调用者和被调用者):用来解决相互作用,但是不确定具体类型的两个对象在A调用B时的具体对象选择。第一次用来确定对象A的类型,第二次用来确定对象B的类型。

访问者模式是多路分发的一种类型。使用场景:存在一个不可改变的主类层次结构——该层次结构也许来自某个软件供应商,而你无法对其进行任何修改。但是希望为该层次结构加上某种多态操作,通常就必须是在基类接口中增加一个方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值