设计模式总结

设计模式是利用封装,继承,多态三大特色,遵循一系列原则的可重用软件设计方式。

设计模式的类型

创建型模式:工厂模式,抽象工厂模式,单例模式,建造者模式,原型模式。
结构型模式:适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。(多出来的一种,过滤器模式)
行为型模式:策略模式,模板方法模式,观察者模式,迭代子模式,责任链模式,命令模式,备忘录模式,状态模式,访问者模式,中介者模式,解释器模式。(多出来的一种,空对象模式)
以上为23中基础设计模式。
另外又有了j2EE模式:MVC模式,业务代表模式,组合实体模式,数据访问对象模式,前端控制器模式,拦截过滤器模式,服务定位模式,传输对象模式。
创建型模式–>对象怎么来
结构型模式–>对象和谁有关
行为型模式–>对象与对象在干嘛
J2EE 模式–>对象合起来要干嘛

设计模式的六大原则

  1. 开闭原则(Open Close Principle)
    开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
  2. 里氏代换原则(Liskov Substitution Principle)
    里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
  3. 依赖倒转原则(Dependence Inversion Principle)
    这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
  4. 接口隔离原则(Interface Segregation Principle)
    这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。
  5. 迪米特法则,又称最少知道原则(Demeter Principle)
    最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
  6. 合成复用原则(Composite Reuse Principle)
    合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。

开闭原则:实现热插拔,提高扩展性。
里氏代换原则:实现抽象的规范,实现子父类互相替换;
依赖倒转原则:针对接口编程,实现开闭原则的基础;
接口隔离原则:降低耦合度,接口单独设计,互相隔离;
迪米特法则,又称不知道原则:功能模块尽量独立;
合成复用原则:尽量使用聚合,组合,而不是继承;

菜鸟教程
创建型模式
##创建型模式 ##
工厂模式:明确地计划不同条件下创建不同实例时使用。扩展性高,增加产品,只要扩展一个工厂类。但类个数会成倍增加。(简单对象无需使用工厂)
抽象工厂模式:产品多余一个的产品族,系统只消费某一族的产品时使用。创建对象接口实现,保证只使用同一产品族的对象。但族扩展困难,既要在抽象里加代码,又要再具体里面加代码。
单例模式:当全局使用的类频繁地创建和销毁时使用。减少内存开销,避免对资源的多重占用。但没有接口不能继承。(同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。)
建造者模式:同样的构建过程可以创建不同的表示,当一些基本部件不会变,其组合经常变化的时候使用。建造者独立,易扩展但产品必须有共同点。(与工厂模式区别,更加关注与零件的装配顺序)
原型模式:当直接创建对象的代价比较大,系统独立于产品创建,构成,表示;实例化的类在运行时指定时使用。性能提高,资源优化,逃避构造函数约束,但对于类的功能要通盘考虑。(拷贝现有对象)
菜鸟教程
结构型模式

结构型模式

适配器模式:需要使用现有的类但此类的接口不符合系统需要;将一个类插入另一个类时使用。可以将任何两个没有关联的类一起运行,提高类的复用,增加类的透明度,灵活性好。过多使用适配器,系统零乱,java至多继承一个类,至多只能适配一个适配器类,目标类必须是抽象类。(解决正在运行的项目,设计时不要用,多适配器建议重构)。
桥接模式:将抽象部分与实现部分分离,在系统有多个角度分类,每一个角度都可能变化是使用。抽象和实现的分离,优秀的扩展能力,细节对客户透明。但增加系统理解设计难度,要对抽象进行设计编程,(一个类存在多个多个独立变化的维度)
过滤器模式/标准模式:使用不同的标准过滤一组对象。
组合模式:表示对象的部分-整体层次结构(树形结构),统一的使用组合结构的所有对象。调用简单,节点自由增加。但叶子和树枝的声明都是实现类,不是接口。
装饰器模式:动态地给一个对象增加额外的职责,在不想增加许多子类的情况下扩展类时使用。装饰模式是继承的替代模式,动态扩展一个实现类的功能。但多层装饰比较复杂。(可代替继承)
外观模式:客户端不需要知道内部联系,系统只需提供一个入口时使用。减少系统依赖,提高灵活性安全性。但改东西比较麻烦,不适合继承重写。(定义系统的每一层入口)
享元模式:系统中有大量对象,对象消耗大量内存,状态大部分可以外部化,有共同的部分时使用。大大减少对象的创建,降低系统内存。但提高系统复杂度。(线程安全问题,必须有一个工厂对象管理)
代理模式:为其他对象提高一种代理以控制对这个对象的访问,当想在访问一个类时做一些控制时使用。职责清晰,高扩展性,智能化,但可能请求的处理速度变慢,代理需要额外的工作。(适配器:改变所考虑的借口,代理模式:不能改变代理的接口;装饰器:增强功能,代理:加以控制)

菜鸟驿站
行为型模式
行为型模式

行为型模式

责任链模式:在处理消息的时候以过滤很多道时使用。降低耦合度,简化对象,增强给对象指派职责的灵活性,增加新的请求处理类方便。但不能保证请求一定被接收,调试不方便。
命令模式:要对行为进行”记录、撤销、重做、事务“等操作时使用。降低系统耦合度,新命令很容易添加。但某些系统会有过多的具体命令类。
解释器模式:一种特定的问题发生的频率足够高时使用。扩展性比较好,灵活,易于实现简单文法。但使用场景比较少,复杂文法难维护,类膨胀,递归调用。
迭代器模式:当遍历一个聚合对象时使用。简化聚合类,以不同方式遍历一个聚合对象,可以有多个遍历,无须修改原有代码。但类的个数增加。(分离了集合对象的遍历行为)
中介者模式:当多个类相互耦合,形成网状结构时使用。降低类的复杂度,各个类之间的解耦。但中介者会庞大,变的复杂难以维护。(不应当在职责混乱时使用)
备忘录模式:记录一个对象的内部状态,能够恢复到他原先的状态时使用。能回到历史的状态,实现信息的封装。但消耗资源,每一次保存都会消耗一定的内存。(符合迪米特原则,增加管理备忘录的类,节约内存使用原型模式+备忘录模式)
观察者模式:对象的发生改变,所有依赖对象都得到通知时使用。观察者和被观察者是抽象耦合的,建立一套触发机制。但所有的观察者都通知需要花费很多时间,可能会循环调用,不知道观察者是怎么变化的。(一般采用异步方式)
状态模式:代码中包含大量与对象状态有关的条件语句时使用。封装了转换规则,共享一个状态对象,减少系统对象个数。但增加系统类和对象的个数,需要修改负责状态转换的源代码。(在行为受状态约束的时候使用状态模式,而且状态不超过 5 个)
空对象模式:,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系
策略模式:一个类 的行为或其算法可以在运行时更改时使用。算法可以自由切换,避免多重判断,扩展性好。但策略类会增多,所有策略类都需要对外暴露接口。(一个系统的策略多于四个,就需要考虑使用混合模式)
模板模式:一个抽象类公开定义了执行它的方法的方式/模板,它的子类可以按需要重写方法实现。当有一些通用的方法时使用。封装不变部分,扩展可变部分,提取公共代码,父类控制,子类实现。但类个数增加。(防止恶意操作,一般模板方法加上final)
访问者模式:需要对对象结构中的对象进行很多不同并且不相关的操作,避免操作污染这些对象类时使用。优秀的扩展性,灵活性。但具体元素对访问者公布细节。(可以对功能进行统一)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值