模式学习

模式学习

模式设计的六个原则

  1. 单一职责原则
  2. 里氏替换原则
    父子继承,子可有个性,子可重载父方法,方法参数范围扩大,子可重写父方法,子return范围可变小。
  3. 依赖倒置原则
    可分为constructor注入依赖和setter注入依赖
  4. 接口隔离原则
    拆分复杂接口
  5. 迪米特原则
    最少知识
  6. 开闭原则
    对修改封闭,对扩展开放

1、单例模式

一般使用单例的扩展模式,扩展模式的设计原则有两条,一是单例对所有线程保证其唯一性,二是尽量延迟加载单例。六种扩展模式:
  1. 饿汉模式:类初始化时new出单例。
  2. 懒汉模式:初次调用单例时,new出单例
  3. DCL(Double Check Lock)模式:两次单例非空判断,第一次提高效率,第二在synchronized块后进行,防止在获得锁过程中,其他线程已经new出了单例。
  4. 枚举模式:通过设置单一的枚举值,实现单例模式。
  5. 静态内部类:延迟加载,且线程安全。

2、工厂方法模式

工厂方法模式扩展为:
  1. 简单工厂模式:去掉抽象工厂,直接使用工厂静态方法。
  2. 替代工厂模式:用工厂模式,采用反射方法(Reflection)生产单例。
  3. 延迟初始化模式:采用资源池(Map)使用和回收产品对象。

3、抽象工厂模式

为实现多个工厂生产多个产品族而设计,产品族包含不同种类和不同等级的产品,该模式不利于产品族的扩展,有利于种类和等级的扩展。

4、模板方法模式

抽象类中抽象方法由子类重写,模板方法中安排抽象方法的实现顺序或过程,注意使用钩子方法(protected访问类型),在子类中影响模板方法的执行。

5、建造者模式

定义产品、建造者(abstract和concrete)、director三者,用建造者调整改变产品内部逻辑从而形成不同种类的产品。注意与工厂方法模式之间的区别,工厂模式通过限定条件直接生产产品,建造者模式通过调整产品内部逻辑生产产品。

6、代理模式

三种扩展代理模式:
   1.普通代理:只知代理,不知真实角色。
   2.强制代理:必须通过真实角色找到代理。
   3.动态代理:通过InnovacationHandler实现真实角色的所有接口方法,再通过Proxy的newProxyInstance()函数生产代理类,由代理类执行接口方法。例子:Spring AOP和Struts的interceptors。

7、中介者模式

colleague相互依赖方法的调用通过mediator实现。适用于复杂的交互系统,例子:SpingMVC。

8、命令模式

command中execute方法封装receiver方法的调用 

9、责任链模式

链上各个handler按照自己的level处理请求,并将非自己level处理的请求依次下传。

10、装饰模式

一种特殊的代理形式,decorator代理component,并由其具体concreteDecorator重写component的operate方法。

11、策略模式

利用继承和多态,context封装策略(算法)。
扩展:策略枚举,枚举中定义abstract算法,在各个成员中实现算法。由于直接暴露算法违反了迪米特原则,因此算法一般由工厂方法模式实现。

12、适配器模式

对源类改造以适应目标接口,使用该模式,一般应用于开发后期,弥补缺点。
两种适配器,一种类适配器,即继承源类,实现目标接口;第二种对象适配器,即聚集实现了源接口的对象,在实现目标接口时,使用这些对象。

13、组合模式

composite和leaf实现同样的抽象类,composite一般包含add、remove、getChildren方法。
扩展模式:
    1. 安全模式:高层依赖底层,违反里氏替换原则。
    2. 透明模式:抽象类包含了所有的方法,更正了安全模式缺陷。
注意,以上模式可由上自下遍历元素,如要自下向上遍历元素需要setParent方法,并且在add子元素时,需要同时见将子元素的母元素设置为当前元素。

14、观察者模式

观察者以集合的形式,在被观察者中被逐一通知,观察者的update方法应包含被观察者。java中以Observable接口和Observer抽象类形式出现。

15、门面模式

利用聚集的方式,将业务逻辑变化封装在子系统内,统一向外提供接口。

16、备忘录模式

将需要备份的状态信息与bean关联,随时存储和获取bean中状态信息。
扩展模式:
1.多状态备忘录模式:将需要备份状态信息(property)的类看成bean,通过内省机制备份(read)和恢复(write)bean的状态信息。
2.多份备份的备忘录模式:给备忘录盖上时间戳。
3.访问受限的备忘录模式:仅备份人自身可访问备忘录,通过备忘录空接口和内部类实现。空接口用于外部访问,内部类在备份人内部implements了空接口,并setter and getter 状态信息。

17、访问者模式

访问者模式将数据与表现分离,以visitor表现具体的element,visitor的act方法依赖具体的element,因此违反了依赖倒置原则。
**访问者模式是双分派的一种实现形式,双分派根据编译时接收者类型和参数类型确定重载方法,因此是静态的。java本来只支持单分派,即根据运行时接收者类型确定重写方法,因此是动态的。**

18、状态模式

将做什么事时状态变化,转换为什么状态下做什么事,即颠倒动作和状态的逻辑关系。context封装所有状态,并委托状态执行动作(方法)。状态中的方法包括本状态下必须实现的业务处理逻辑,也包括转向其他状态时的业务处理逻辑。
适用于行为随状态变化的场景,以及ifelse或switch语句场景。

19、享元模式

享元的内部状态为对象共享信息,不随环境变化,外部状态为对象依赖的标记,随环境变化。flyweight的外部状态尽量采用java基本类型以提高效率,其数量不能太少,以减少线程不安全因素。
享元模式与对象池的区别:前者重共享,后者中复用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值