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关键字,如果方法放在本类中,既不增加类间关系,对本类不产生负面影响,就放置在本类中

六.开闭原则

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

你可能感兴趣的:(Java设计模式与设计原则)