JAVA设计模式总结

一、OO基础

1、抽象

2、封装

3、多态

4、继承

二、OO原则

1、封装变化

2、多用组合少用继承

3、针对接口编程,不针对实现编程

4、为对象之间的松耦合设计而努力

5、对扩展开放,对修改关闭

6、依赖抽象,而不是依赖具体

7、只和朋友交谈

8、别找我,我会找你

9、类应该只有一个改变的理由

三、OO设计模式

1、策略模式

定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

2、观察者模式

在对象之间定义一对多的依赖,这样一来,当一个对象改变状态时,依赖他的对象都会收到通知,并自动更新。

要点
  • 观察者模式定义了对象之间的一对多关系。
  • 主题也就是可观察者用一个共同的接口来更新观察者。
  • 观察者和可观察者之间使用松耦合方式结合,可观察者不知道观察者的细节,只要观察者实现了观察者接口。
  • 使用观察者模式的时候,可以从被观察者处推或拉数据。
  • 有多个观察者时,不可以依赖特定的通知次序。
  • java.util.Observable中的setChanged()方法为protected,这意味着除非继承自该类,否则无法创建Observable实例并组合到自己的对象中。或者需要我们自己实现观察者与可观察者接口。

3、装饰者模式

动态的将责任附加到对象身上,想要扩展功能,装饰者提供有别于继承的另一种选择。

要点
  • 继承是扩展的形式之一,但不见得是达到弹性设计的最佳方式。
  • 组合和委托可以在运动时动态的加上新的行为。
  • 装饰者模式意味着一群装饰者类,这些类用来包装具体的组件。
  • 装饰者类反映了被装饰者的组件类型,事实上他们具有相同的类型。
  • 装饰者可以在被装饰者的行为前面或后面加上自己的行为,甚至是取代被装饰者的行为从而达到特定的目的。
  • 可以用无数个装饰者包装一个组件。
  • 装饰者一般对组件的客户是透明的,除非客户程序非常依赖组件的具体类型。
  • 装饰者会让程序中出现许多小对象,过度使用会让程序变得复杂。

4、工厂模式

定义一个创建对象的接口,但又子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。

要点
  • 多有的工厂模式都是用来封装对象的创建。
  • 简单工厂对然不是真正的设计模式,但是是一种简单的方法,可以将客户的程序从具体的类解耦。
  • 工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象。
  • 抽象工厂使用对象组合面对想的创建被实现在工厂接口所暴露出来的方法中。
  • 所有的工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合。
  • 工厂方法允许类将实例化要迟到子类进行。
  • 抽象工厂创建相关的对象家族,而不依赖具体实现。

5、单例模式

确保一个类只有一个实例,并提供全局的访问点。

要点
  • 单件模式确保程序中一个类最多只有一个实例。
  • 单件模式提供访问这个实例的全局点。
  • 实现单件模式需要一私有构造器、一个静态方法、一个静态变量。
  • 确定性能和资源上的限制,然后选择适当的方案解决多线程问题。
  • 试过不使用第五版的JAVA2,双重检查加锁机制会失效。
  • 如果使用多个类加载器可能使得单件实效。
  • 在JVM1.2之前的版本,必须建立单件注册表,以免垃圾回收器将单件回收。

6、命令模式

将请求封装成对象,这可以让你是用不同的请求、队列或者日志请求来参数化其他对象,命令模式也支持撤销操作。

要点
  • 命令模式将发出请求的对象和执行请求的对象解耦。
  • 在被解耦的两者之间使用过命令对象进行沟通的,命令对象等装了命令接受者的一组动作。
  • 调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用。
  • 调用者可以接受命令当作参数,甚至实在运行时动态进行。
  • 命令可以支持撤销。
  • 宏命令是命令模式的简单延伸,允许调用多个命令。
  • 命令可以用来实现日志和事务系统。

7、适配器模式

将一个类的接口转换成客户期望的另外一个接口,适配器让原本不兼容的类可以合作无间。

要点
  • 当需要一个现有的类而其接口不符合需要时,就是用适配器。
  • 适配器改变接口符合客户期望。
  • 适配器模式有两种,对象适配器利用组合的方式,类适配器利用继承的方式。

8、外观模式

提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口让子系统更容易使用。

要点
  • 当需要简化并统一一个很大的接口或一群复杂的接口时,使用外观模式。
  • 外观将客户从复杂的子类系统中解耦。
  • 实现一个外观,需要将子系统组合到外观中,然后将工作委托给子系统执行。
  • 可以为一个子系统实现多个外观。

9、模板方法模式

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

要点
  • 模板方法定义了算法步骤,把步骤的具体实现延迟到子类。
  • 模板方法模式为我们提供了一种代码复用的技巧。
  • 模板方法的抽象类可以定义具体方法、抽象方法和钩子。
  • 钩子是一种方法,在抽象类中不做事或者是做默认的事,子类可以选择不去覆盖。
  • 为了方式子类覆盖算法,可以将该方法申明为final。
  • 将决策权放在高层,以便决定何时以及如何调用底层。
  • 工厂方法是模板方法的特殊模式。

10、迭代器模式

提供一种顺序访问一个聚合对象的方法,而不暴露其内部的实现。

要点
  • 迭代器允许访问聚合元素,而不需要暴露其内部实现。
  • 迭代器将遍历聚合的工作封装进一个对象。
  • 当使用迭代器的时候,我们以来聚合提供迭代器。
  • 迭代器提供了一个通用的接口,让我们遍历聚合项,当我们编码使用聚合项时,就可以使用多态。
  • 应该只给一个类分配一个责任。

11、组合模式

允许将对象组成树形结构来表现整体部分的层次,组合能让用户以一致的方式处理个别对象和对象组合。

要点
  • 组合提供一个结构,同时包容个别对象和对象组合。
  • 组合模式允许客户对个别对象和对象组合一视同仁。
  • 组合结构内的任意对象称为组件,组件可以是组合也可以是叶节点。
  • 根据需要平衡透明性和安全性。

12、状态模式

允许对象在内部状态改变时改变他的行为,看起来好像修改了类。

要点
  • 状态模式允许一个对象基于状态而拥有不同的行为。
  • 状态模式用类表示状态。
  • Context将行为委托给当前状态。
  • 状态的转换可以由State类或者Context类控制。
  • 状态类可以被多个Context类实例共享。

13、代理模式

为另一个对象提供一个替身或占位符以访问这个对象。

要点
  • 远程代理管理客户和远程对象之间的交互。
  • 虚拟代理控制访问实例化开销大的对象。
  • 保护代理基于调用者控制对对象的访问。

14、复合模式

结合两个或以上的模式组成一个解决方案,解决一再发生的一般性问题。

要点
  • MVC时复合模式,结合了观察者模式、策略模式、组合模式。
  • 模型使用观察者模式,以便观察者更新,同时保持解耦
  • 控制器是视图的策略,视图可以使用不同的控制器,得到不同的行为。
  • 视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件。

15、桥接模式

不止可以改变实现也可以改变抽象。

要点

  • 将实现予以解耦,让他和界面不再永久绑定。
  • 抽象和实现可以独立扩展。
  • 对于具体抽象类所要做的改变,不会影响到客户。
  • 适合使用在跨平台的图形和窗口上使用。
  • 当需要不同的方式改变实现和接口时,可以使用桥接。
  • 增加了复杂度。

16、生成器模式

封装一个产品的构造过程,并允许按步骤构造。

要点
  • 将复杂对象的创建过程封装起来。
  • 允许对象通过多个步骤创造,并且可以改变过程。
  • 向客户隐藏内部表现
  • 产品的内部实现可以被替换,因为客户只看到一个抽象的接口。
  • 经常被用来创建组合结构。

17、责任链模式

让一个以上的对象有机会能够处理某个请求。

要点
  • 将请求者和接收者解耦。
  • 可以简化对象,因为他不知道链的结构。
  • 通过改变链内的成员或者次序,允许动态的增加删除责任。
  • 经常被用在窗口系统中,用来处理鼠标和键盘制类的事件。
  • 不保证请求一定会被执行。
  • 不易于观察运行时特征。

18、蝇量模式

让某一个类提供许多虚拟实例。

要点

  • 减少运行时对象的个数,节省内存。
  • 将许多虚拟对象集中管理。
  • 当一个类拥有许多实例,并且能被同一方法控制时使用蝇量模式。
  • 一旦实现蝇量模式,那么单个逻辑无法拥有独立不同的行为。

19、解释器模式

为语言创建解释器。

要点
  • 将每个语法规则表示成一个类,方便实现语言。
  • 可以容易的改变扩展此语言。
  • 通过在类结构中加入新的方法,可以在解释的同时增加新的行为。
  • 可以处理脚本语言和编程语言。
  • 当语法规则的数目较大时,该模式可能较复杂。

20、中介者模式

集中相关对象之间度咋的沟通和控制方式。

要点
  • 通过将对象彼此解耦,可以增加对象的复用性。
  • 通过控制逻辑集中,可以简化系统维护。
  • 可以让对象之间传递的消息变得简单而且大幅减少。
  • 控制过于集中,若设计不当,中介者对象会相当复杂。

21、备忘录模式

可以让对象返回之前的状态。

要点
  • 将被存储的状态放在外面,不要和关键对象放在一起,可以帮助维护内聚。
  • 保持关键对象的数据封装。
  • 提供容易实现的恢复功能。
  • 存储和恢复状态的过程耗时。
  • 可以考虑序列化机制存储系统状态。

22、原型模式

创建给定类的实例过程很昂贵或者很复杂时,使用原型模式。

要点
  • 向客户隐藏了创建新实例的复杂性。
  • 在某些环境下复制对象比创建对象更有效。
  • 有时对象的复制相当复杂,需要深拷贝。

23、访问者模式

要为一个对象的组合增加新的能力且封装不那么重要时。

要点
  • 允许对组合结构加入新的操作,而无需修改结构本身。
  • 加入新的操作相对容易。
  • 当采用访问者模式时,会打破组合类的封装。
  • 因为游走的功能牵涉其中,多以对组合结构的改变比较困难。

要抱抱才会开心呀~~~~~~~~~~~~

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值