Java设计模式与设计原则

Java 24 设计模式

一.策略模式(Strategy pattern)

    1.策略的共同点抽象成接口,具体策略实现这个接口;

    2.抽象一个策略接口的包装容器Context,里面包装策略的实现方法;

    3.策略的具体执行类,负责策略的最终应用;

    总结:

    策略模式体现高内聚低耦合的特点,把具体策略类,策略共同点抽象出的接口,及策略的执行场景(上下文),具体的策略执行类分开;

二.代理模式(Proxy pattern)

    1.定义一类事物共同的特点(能执行的操作)抽象成接口

    2.具体的事物类,实现这个接口,及具体执行的操作

    3.如果其中一个事物类不能做这些事,可以将其定义成其他事物类的代理

    4.定义成其他事物类的代理的类,要实现两个构造方法,一个是定义默认代理的事物类,一个是可以任意定义代理的事物类;实现以后的复用;

    总结: 代理模式体现java的多态特性,代理类接到任务交给其他被代理的类去完成,前提是代理类和被代理类实现同一个接口;

三.单例模式(Singleton pattern)

    1.类的构造方法是私有的

    2.类中有一个获取类实例的静态方法

    3.多线程情况还要考虑线程同步获取实例的方法

    总结:

    单例模式用在要且只要一个对象的类,保证类实例的唯一性;

四.多例模式(有上限的多例模式)(Mulition pattern)

    1.类的构造方法是私有的

    2.把获取实例的方法放在静态代码块中,把获取的实例放在List中

    3.多线程情况很少

    总结:

    多列模式,但实例的数量有个上限,需要根据具体情况设置。

五.简单工厂模式(Simple factory pattern)

    1.把要产生的类的共性抽象成一个接口

    2.具体的类实现这个接口

    3.写一个产生类的工厂方法

    4.写一个利用工厂制造类的操作者类

    总结:

    简单工厂模式简化了生成具体对象,我们所需要的只需要修改对象对应的类的共同属性就可以实现,工厂类完成其他操作

六.抽象工厂模式(Abstract factory pattern)

    1.定义最终目标类的共性成一个接口

    2.定义要最终目标类的抽象类,实现目标类共性定义的接口

    3.定义目标类中几个不同的属性的具体执行类继承对应的抽象类

    4.根据工厂类最终要实现的方法,定义一个工厂类接口

    5.定义一个包含通用方法的抽象类,实现工厂类接口

    6.根据具体需要,创建具体实现工厂类,继承抽象类

    总结:

    工厂模式符合开闭原则(OCP),在产品中增加一类产品,再增加一个工厂方法就可以了。

七.门面模式(Facade pattern)

    1.根据处理某类事件的具体操作定义一个接口

    2.定义一个具体实现上面接口的实现类

    3.定义一个类把所有操作封装在一个方法里

    4.定义一个需要这些操作的客户端

    总结:

    门面模式把一些复杂的操作封装起来,让用户感觉操作起来十分简便。如果操作流程改了,只需要改少量代码即可达到需求。

八.适配器模式(Adapter pattern)

    1.定义一个适配者所有的操作接口

    2.定义一个类实现这个适配者操作接口

    3.定义一个被适配者所有操作的接口

    4.定义一个类实现被适配者操作接口

    5.定义一个连接两者的适配器

    6.定义一个需要具体操作的类

    总结:

    适配器模式不适合在设计阶段使用,主要应用在扩展修改系统功能时使用,使用适配器模式减少原有系统代码修改。

九.模板模式(Template pattern)

    1.定义一个顶级抽象类模型,包含基本方法和模板方法(基本方法的组合)

    2.定义具体的对象模型类,继承顶级抽象模型类

    3.定义执行操作类

    总结:

    模板方式在(struts2)应用挺多,提供一个抽象类,然后修改其protected方法,实现具体的功能,然后调用一个execute方法,完成操作。父类调用子类的方法,在项目中不建议使用

十.建造者模式(Builder pattern)

    1.前一部分如同模板模式

    2.根据实际需求创建一个建造者抽象类,定义建造者用到的方法

    3.根据具体需要被造的物体设计对象制造者类,继承建造者抽象类

    4.根据客户最终需要设计指导者类,确定具体建造流程

    5.定义执行操作类

    总结:

    建造者模式适合产品类复杂繁多的情况,就是业务较复杂时。还有对象在创建过程中使用到其他不易得到的对象。

十一.桥梁模式(Bridge pattern)

    1.定义一个最终目的产品抽象类,包含对应的抽象操作方法

    2.定义最终产品类,继承上面的目的产品抽象类,重写抽象操作方法

    3.定义一个负责生产最终目的产品的抽象公司类,包含公司类要实现的方法

    4.定义生产具体产品的公司类继承抽象公司类,重写抽象公司类的方法

    5.定义执行操作类

    总结:

    桥梁模式的优点是类间解耦,使类间的联系弱化。业务抽象角色引用业务实现角色

十二.命令模式(Command pattern)

    1.根据命令的最终接受者执行的操作,定义抽象命令接收者命令

    2.定义命令接收者类,继承上面定义的抽象类

    3.定义命令抽象类,包含一个execute方法

    4.定义具体的命令类

    5.定义命令调度者类,接收命令并布置具体执行

    总结:

    命令模式具备很好的封装性,把命令的请求方和执行方分开了。但如果业务逻辑复杂,Command类会过于复杂,在实际项目中类会膨胀。

十三.装饰模式(Decorator pattern)

    1.定义一个最原始的,被修饰的核心类

    2.定义具体的被装饰的具体类,继承核心类

    3.定义一个装饰抽象类

    4.根据具体的被装饰类,定义装饰类

    5.定义要查看最终被装饰产品的类

    总结:

    装饰模式是对继承的补充,装饰模式是给类动态的增加功能

十四.迭代器模式(Iterator pattern)

    1.定义一个具体项目迭代器接口继承java.util.Iterator类

    2.定义一个项目使用的迭代器类,实现上面那个接口

    3.定义有一个对项目的操作接口

    4.定义具体的项目操作类实现上面的接口

    5.定义项目的最终操作类

    总结:

    Java已经把迭代器给我们准备好了,项目很少再独立写迭代器了,直接用List或Map就可以解决问题。

十五.组合模式(Compsite pattern)

    1.定义一个实现所需功能的抽象类

    2.根绝具体所需生成的对象定义类,继承上面的抽象类

    3.定义跟节点类,及接口

    总结:

    组合模式分为安全模式和透明模式,提供一套组合方法,适合树形结构或者局部与整体的关系。

十六.观察者模式(Observer pattern)

    1.定义一个被观察者实现Observable接口。

    2.观察者实现Observer接口。

    3.操作类实现具体操作

    总结:

    观察者和被观察者自己没有任何联系,方便以后的扩展和维护。

十七.责任链模式(Chain of Responsility pattern)

    1.根据请求对象的属性,定义一个接口

    2.定义具体的请求对象类

    3.根据请求处理者类抽象一个Handler类

    4.定义具体的请求处理者类,继承上面的抽象类

    总结:

    责任链模式是请求者不必考虑谁是处理者,只要请求发出,就会有处理者,Handler的子类可以继续增加下去。调用者不用了解变化过程。

十八.访问者模式(Visitor pattern)

    1.定义一个访问者超级接口

    2.定义具体的访问者接口,包含访问者要实现的方法

    3.定义具体的访问者实现类

    4.定义被访问的对象的抽象类

    5.实现具体的被访问对象继承上面的类

    6.执行操作类

    总结:

    访问者模式是访问者对象和被访问者对象隔离,根据访问者模式能实现简单的Interceptor

十九.状态模式(State pattern)

    1.定义要表示的对象抽象出来的接口

    2.定义具体的对象类,实现上面定义的接口

    3.定义对象状态的抽象类

    4.定义对象处于的环境上下文类

    5.定义对象会处于的具体状态类

    6.客户端执行类

    总结:

    状态模式,当一个对象内在状态改变时,允许其改变行为,看起来好像对象对应的类发生了改变,但子类会太多。

二十.原型模式(Prototype pattern)

    1.写一个要被创建的对象类的模板类

    2.定义要被clone的对象类

    3.客户端执行操作

    总结:

    原型模式是对通过对已有对象的拷贝创建新对象。既能节约硬件资源也能有效保护元对象不被修改。

二十一.中介者模式(Mediator pattern)

    1.定义抽象的中介者类,具体的中介者去继承这个类

    2.定义中介这要协调的同伴类

    3.定义要执行具体操作的类

    4.客户端调用执行

    总结:

    中介者模式实现很好的封装,是类间的依赖减少。

二十二.解释器模式(Interpreter pattern)

    1.声明一个表达式都要实现的抽象类,包含interpret()方法

    2.具体的表达式类,继承上面的抽象类,实现具体的方法

    3.表达式运行的上下文环境类

    4.客户端调用执行类

    总结:

    定义一个语句,解释器模式可以定义出其文法的一种表示,并提供一个解释器,客户端可以利用解释器来解释这个语句。

二十三.亨元模式(Flyweight pattern)

    1.定义只有内蕴状态的类,内蕴状态不会改变可以共享

    2.定义含有外蕴对象的类,外蕴状态会随环境改变而改变,不可以共享

    3.单纯亨元模式和符合亨元模式

    总结:

    亨元模式可以有效降低内存中对象的数量,但会使系统变复杂,将亨元对象的状态外部化,读取外部状态的时间会变长。

二十四.备忘录模式

    1.定义一个备忘录类接口,起标识作用

    2.定义一个备忘录类,保存状态信息

    3.定义一个发起者,负责改变状态

    总结:

    备忘录模式,可以有效恢复对象的状态。在不破坏封装的前提下,将对象的状态捕捉。

Java 6个设计原则

一.单一职责原则

    接口做到单一职责,一个接口定义一类方法属性,类尽量只有一个原因引起变化。

二.里氏替换原则

    里氏替换原则目的是加强程序的健壮性,在版本升级时可以做到非常好的兼容性,一个类的修改,不会影响其他类的正常运行。

三.依赖注入原则

    把各个类间的依赖关系交给第三方进行管理,类间没有直接的依赖关系,或依赖很弱,调用者不需要考虑类之间的依赖关系,后期对项目的维护也会相对简单。这样这些就实现了高内聚低耦合。

四.接口隔离原则

    根据接口隔离原则拆分接口时,必须满足单一职责原则。接口隔离原则实现高内聚,并可提供定制化服务

五.迪米特法则

    出现在成员变量,方法的输入输出参数中的类被称为成员朋友类,一个类只和朋友类交流。

    对外公布尽量少的public方法和非静态的public变量,尽量内敛,如果能设置成最终不可改变,尽量就加上final关键字,如果方法放在本类中,既不增加类间关系,对本类不产生负面影响,就放置在本类中

六.开闭原则

    一个软件应该对扩展开放,对修改关闭,保证模块在不被修改的前提下被扩展。满足可复用和易维护,核心是抽象一个事物。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容

  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,947评论 1 15
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,657评论 18 139
  • 原文链接:http://blog.csdn.net/zhangerqing http://www.cnblogs....
    孤独杂货铺阅读 1,516评论 0 3
  • 家里有俩个男人 一个顽固 一个执拗 顽固的那个 为了勤俭 什么都舍不得 执拗的那个 将关心藏在心底 俩个人吵得不可...
    舞妩阅读 142评论 0 1