设计模式解读之结合Java实际应用
创建型模式:
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
结构型模式:
这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
行为型模式:
这些设计模式特别关注对象之间的通信。
J2EE 模式:
这些设计模式特别关注表示层。这些模式是由 Sun Java Center 制定的。
理解:当有一个新需求的时候,我们是通过拓展来实现客户需求,而不是通过修改原有代码
六大原则:单一职责,里式替换,依赖倒置,接口隔离,迪米特,开闭
框架和架构和设计模式,设计重用,代码重用!高内聚低耦合!
依赖倒置:高层模块不应该依赖底层模块,二者都应该依赖其抽象;抽象不应依赖细节,细节应该依赖抽象
Mother: narrate(IReader reader) Interface IReader -- Book,NewsPaper
***Spring 框架中都用到了哪些设计模式?***
Spring 框架中使用到了大量的设计模式,下面列举了比较有代表性的:
1. 工厂模式:Spring 本身就是一个超级大工厂,Spring 容器负责创建所有 Bean,因此 Spring 框架本身就是从工厂模式扩展而来的。
抽象工厂简单地说是工厂的工厂,抽象工厂可以创建具体工厂,由具体工厂来产生具体产品。 抽象工厂模式有个缺陷,就是当用户需求改变的时候,需要修改代码,然后需要重新编译,最好是将用户需求(可以看做用户订单)放在一个配置文件里面,由代码根据配置文件来创建相应的工厂以及实例,这样当用户需求发生改变的时候,只需要修改配置文件(产品订单)即可。
Spring IOC容器是一个抽象工厂,既可以管理Bean实例,还可以管理工厂实例。ApplicationContext.xml可以看作是系统的订单,容器根据这个订单生产相应的Bean。
2. 单例模式:容器中 singleton Bean 都是单例的。 双重加锁
3. 代理模式:Spring AOP 就是基于代理模式的,由于所有 AOP 代理和目标对象之间的关系就是代理和目标之间的关系。
4. 策略模式:Spring 的事务控制、资源访问都是策略模式的典型应用。其中事务控制的策略接口就是PlatformTransactionManager,该接口定义了事务控制的 3 个核心方法,Spring 为该策略接口提供了大量的策略实现类;资源访问的策略接口是 Resource 接口,Spring 为该接口提供了大量的策略实现类。
工厂模式:总共三种,在俄罗斯方块中,将对象交给工厂类(设计成单例?)来生成,客户端代码成功与被调用对象的实现类分离。框架中大量的工厂,例如mybatis中的SqlSessionFactory,BeanFactory,抽象工厂就是工厂的工厂,将工厂再细分出来
模板模式:画swing的面板,构造方法初始化 各个面板,长宽通用的数据,方法, 代码重用
还有BaseServlet,进行相同的方式进行权限判断,记录日志和处理异常,在各个子类中只 是完成各自的业务逻辑代码,以及请求装发方式,可以使用return 字符串来处理
单例模式:双重加锁,通过双重判断来保证单列设计模式在多线程中的安全性,
并且它在性能方面提高了很多,懒汉,饿汉,减少创建Java实例所带来的系统开销,例如:spring的bean,windows应用程序:回收站
代理模式:spring框架的代理,静态代理:一个接口就要一个代理,动态代理运用反射,能够根据传 进来的方法在运行时决定调用哪个方法
通过代理类的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime) 实现动态关联。
Hibernate框架里的延迟加载就是代理模式的应用。
Spring框架中AOP实现也是代理模式的体现。
客户端代码并不知道真正的被代理对象,客户端代码面向接口编程,它仅仅持有一个被代 理对象的接口。
门面模式:业务逻辑组件来封装DAO组件也是典型的门面模式——每个业务逻辑组件都是 众多DAO组件的门面,系统的控制器类无需直接访问DAO组件。
适配器模式:一个接口有很多个抽象方法,我们只要实现其中一个:
可以通过一个抽象类适配器实现这个接口,然后只要继承这个类就可以了对你要的方法重写
俄罗斯方块中swing也是有用的,可以了解了适配器模式,何的模式都有优缺点,适配器模式也不例外,如上面的抽象适配器就有一个明显的缺点,就是将一个接口替换成了抽象类,优点就是可以不用实现我们不需要实现的方法,而只关心我们必须要实现的那些方法,缺点就是由接口变成了类,使用可能会受限,因为java不支持多重继承,但可以实现多个接口。
观察者模式:swing的监听,Java事件机制的底层实现就是观察者模式。完全可以把观察者接口理解成事件监听接口,而被观察者对象也可当成事件源来处理。