设计模式学习(3)

9、模板方法模式

模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法的结构下,重新定义算法的某些步骤。

AbstractClass

      抽象类,定义了算法的骨架templateMethod(),该方法会调用抽象函数primitiveOperation1()、primitiveOperation2();
      子类通过具体实现抽象函数来影响算法的执行情况;

ConcreteClass

      继承自AbstractClass,实现抽象方法;

总结:模板方法模式通过子类的具体实现决定算法的执行,提供了一种代码复用的技巧;该模式还可以在抽象类中定义一些条件函数,在算法骨架方法中应用这些条件函数来控制算法的流程,子类通过覆写这些条件函数可以达到改变算法流程的目的。
      模板方法模式与策略模式有相似的地方,二者都用来控制算法的执行。但策略模式是将一个算法族抽象为一个类,通过类的组合来实现不同的策略;而模板方法则是子类实现父类的抽象方法来控制算法的行为。

10、迭代器模式

提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。


Aggregate(聚合类接口)

     定义一个createIterator()方法,用于返回迭代器;
ConcreteAggregate(具体的聚合类)
   实现了接口的createIterator()方法,返回特定的迭代器;
Iterator(迭代器接口)
   定义了迭代器的基本操作
ConcreateIterator(具体的聚合类迭代器)
   根据聚合类的实际情况实现迭代器的各个方法

总结:迭代器模式使得聚合类的遍历与其具体的结构解耦,从而实现对客户隐藏内部细节,同时迭代器模式也使得类的责任进一步分离,将聚合与遍历放在了两个实现上。

11、组合模式

将对象组合成树形结构来表现整体/部分的层次关系,并且使用户可以使用统一的方式对其进行处理。


Component(节点抽象类)

      提供一个统一的结构,使用户可以统一处理其子类,不管是叶节点还是组合节点;

Leaf(叶节点)

      继承自Component,其下不会再包含任何节点,是结构的最底层;

Composite(组合节点)

     继承自Component,内部会包含叶节点或组合节点;

总结:组合模式实际上实现了一种树形结构,通过继承统一的节点抽象类,使得叶节点与组合节点可以用相同的方式处理。因为组合模式将叶子与集合统一处理,因此有些方法可能会在运行时出错,比如Leaf中就不应该有添加孩子和获得孩子这些操作,因此具体使用时可以在抽象类里只放置共同的方法,这样可以提高安全性;也可以在抽象类中放置所有方法,运行时进行判断或者抛异常。安全性与透明性是一对矛盾。

12、状态模式

状态模式将状态封装成独立的类,并将动作委托到代表当前状态的对象,使得应用场景在内部状态改变时改变其行为。

Context(应用场景)

     其内部包含了各个状态的实例来表示自身不同的状态;
    有一个表示当前状态的引用;
    其中的request()方法将进一步委托到具体状态类的handle()方法;
    request()方法是应用场景对外部暴露的接口,使得使用者不需要了解其内部的具体状态但是能准确地执行指令;

State(状态的抽象接口)

     代表所有状态的抽象接口;
     指定了各个状态都要实现共同方法handle(),可以是只有一个方法,也可以是多个方法,示具体情况而定;

ConcreteState(具体的状态类)

     实现了状态接口和其中的抽象方法,用来表示在当前状态下应该执行的动作;

总结:状态模式通过将状态封装,使得根据状态变化的具体行为也封装到了具体的类中,从而实现应用场景将行为委托到相应的状态对象;具体的状态切换可以有State类控制也可由其应用场景Context来控制,二者不同之处只是在于决定将以后可能的修改放置在哪一个类中。状态模式因为将状态封装为具体的状态对象,因此如果状态较多的话也会产生较多的类。

13、代理模式

代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。

Subject(访问对象的抽象接口)

      提供了一组访问方法request();
      该接口主要用来统一对代理与真实对象的访问;

RealSubject(真实对象)

      实现自Subject接口,提供了具体的行为;

Proxy(代理对象)

      内部有一个真实对象的引用;
      实现了Subject接口,在实现的方法中将行为交给真实对象去执行;

总结:代理模式通过为实际的对象提供一个代理类来控制外界对其的访问。该模式与装饰者模式相似,但装饰这模式在于为对象增加行为,而代理模式在于控制对实际对象的访问。例如在校园里存在的校园代理就可以看做这一模型的实例,商家在校园找学生做代理,当有学生购物时就直接找到代理,然后代理再把订单交给商家发货,如果订单里的商品缺货,那代理就直接告诉了顾客,而不必再发到商家,也就是代理对访问进行了控制。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值