Java学习之设计模式

一、策略设计模式:

定义:该设计模式是一种把具体实现和共同属性分开的一种设计方式,将共同的属性抽象封装父类中,然后将不同的属性或者动作抽取成接口,最后在具体实现类中注入其独特的动作或者属性实现面型接口编程而不是具体实现。

图例

最佳实践:游戏角色和武器。

二、观察这模式

定义:观察者模式是把要观测的对象设抽象成主题(Subject)接口,在该接口中存在三个方法观察者注册、注销和通知方法。将要接收观测消息的对象设置成观察者(Observe)接口该接口中有供主题调用的更新方法以便主题将变化的信息推送。

图例:

最佳实践:气象数据观测展现、实验数据观测。

三、装饰者模式

装饰者模式遵循对扩展开放,对修改关闭的原则,先抽象出一个抽象的超类,然后基于超类衍生两种子类,分别是装饰者和被装饰着类。装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。总之,装饰者模式就是动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有性的替代方案。

图例:

最佳实践;java.io类,咖啡厅根据用户点不同材料的饮品计费。

四、工厂模式(复杂)

简单工厂模式:指的是将系统代码中公共的实例化类的代码抽取出来,封装到一个工厂类中,在具体业务中只需要实例化工厂类,给工厂类传入不同的参数由工厂类返回具体类实例。

最佳实践:将多种类型披萨初始化放到简单工厂进行。

图例:

工厂方法模式:定义一个实例化对象的接口,但是由子类决定要实例化的类是哪一个,工厂方法就是让把具体的类实例化推迟到子类。

图例:

抽象工厂模式:提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。

图例:

最佳实践:将披萨材料和披萨制作抽象成两个不同的工厂。

五、单例模式

单例模式指的是,只初始化一个实例对象的java类,在该类中构造方法是私有的只能本类访问,对外只提供一个getinstance()方法用来获取该类的实例对象,为了解决多线程同步两个线程同时访问该方法造成死锁,需要给该该方法添加synchronized 关键字避免死锁。但是同步方法会影响性能为了减少消耗,可以在第一次初始化实例时同步锁,将sysnchronized放到初始化的代码块,使用。

图例:

六、命令模式。

命令模式:将请求封装成对象,以便使用不同的请求,队列或者日志参数化其他对象。命令模式也支持可撤销操作,也就是将请求的对象和执行请求的对象解耦,让请求和执行对象之间通过命令来联系,请求对象通过给命令对象传递参数来执行某个命令对应的操作。

图例:

最佳实践:

多功能遥控器实现、队列请求、日志请求、餐厅的顾客服务员初始之间的关系。

七、适配器和外观模式(最少知识原则)

适配器就是接口的修饰口,当两个接口不能互相调用时,需要新定义一个接口用来装饰这两个接口使得他们可以互相调用,使得不兼容的连个接口可以互相合作。

对象适配器图例:(组合模式)

类适配器图例(继承模式多继承)

外观模式

通过提供一个更合理的接口的外观类,可以将复杂的子系统变得更容易使用。如果需要使用复杂的功能也可以使用。外观不只是简化了接口,也将客户从组件的子系统中解耦。

外观模式和适配器模式可以包装类,但是外观模式只是简化接口,而适配器的意图是将接口转换成不同接口。

图例

八、模板方法

在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中执行,模板方法使得子类在不改变算法结构下重新定义算法步骤。也就是说在父类中将某一个或者好几个方法中需要变的提炼出来设计证abstract方法,子类通过重写该方法实现自己特殊的步骤,不影响大的流程。除此之外,模板方法还提供了“钩子”方法,“钩子方法”指的是在抽象类中有一个默认的方法,子类可以动态选择是否覆盖该方法,如果覆盖则会对主流程产生影响,如果不覆盖则不会影响。

图例:

九、迭代器模式

提供一种顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

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

10、状态模式

状态模式指的是:允许对象在内部状态改变的时候改变他的行为,对象看起来好像修改了他自己的类。把状态定义成接口,每一个状态类相同的方法,状态可以相互切换,并且将动作委托给代表当前状态的对象

11、代理模式

代理指的是代表某个真实的对象,一般指的是远程对象的本地代理,远程对象可以是在不同的java堆中,或者在不同地址空间的对象。本地对象指的是一种可以有本地方法调用的对象。其行为会转发到远程对象中。

猜你喜欢

转载自blog.csdn.net/sunshine4214/article/details/88076641
今日推荐