- 浏览: 46777 次
- 性别:
- 来自: 北京
最新评论
文章列表
研磨设计模式之策略模式-3
- 博客分类:
- 设计模式
3 模式讲解
3.1 认识策略模式
(1)策略模式的功能 策略模式的功能是把具体的算法实现,从具体的业务处理里面独立出来,把它们实现成为单独的算法类,从而形成一系列的算法,并让这些算法可以相互替换。 策略模式的重心不是如何来实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活、具有更好的维护性和扩展性。
(2)策略模式和if-else语句 看了前面的示例,很多朋友会发现,每个策略算法具体实现的功能,就是原来在if-else结构中的具体实现。没错,其实多个if-elseif语句表达的就是一个平等的功能结构,你要么执行if,要不你就执行 ...
研磨设计模式之策略模式-2
- 博客分类:
- 设计模式
2 解决方案
2.1 策略模式来解决
用来解决上述问题的一个合理的解决方案就是策略模式。那么什么是策略模式呢?
(1)策略模式定义 定义一系列的算法,把它们一个个封装起来,并且使它们可相互 ...
模式2.研磨设计模式之策略模式-1
- 博客分类:
- 设计模式
首先感谢众多朋友的支持、评论和鼓励,只有多多努力,写点好的博文来回报大家的好意!
接下来想写写另外一个虽然较简单,但是使用很频繁的模式——策略模式
策略模式(Strategy)
1 场景问题
1.1 报价管理
向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的客户要报不同的价格,比如:
对普通客户或者是新客户报的是全价
对老客户报的价格,根据客户年限,给予一定的折扣
对大客户报的价格,根据大客户的累计消费金额,给予一定的折扣
研磨设计模式之单例模式-4
- 博客分类:
- 设计模式
3.8 在Java中一种更好的单例实现方式
根据上面的分析,常见的两种单例实现方式都存在小小的缺陷,那么有没有一种方案,既能够实现延迟加载,又能够实现线程安全呢? 还真有高人想到这样的解决方案了,这个解决方案被称为Lazy initialization holder class模式,这个模式综合使用了Java的类级内部类和多线程缺省同步锁的知识,很巧妙的同时实现了延迟加载和线程安全。1:先来看点相应的基础知识 先简单的看看类级内部类相关的知识。
什么是类级内部类? 简单点说,类级内部类指的是:有static修饰的成员式内部类。如果没有 ...
研磨设计模式之单例模式-3
- 博客分类:
- 设计模式
3.3 延迟加载的思想
单例模式的懒汉式实现方式体现了延迟加载的思想,什么是延迟加载呢? 通俗点说,就是一开始不要加载资源或者数据,一直等,等到马上就要使用这个资源或者数据了,躲不过去了才加载,所以也称Lazy Load,不是懒惰啊,是“延迟加载”,这在实际开发中是一种很常见的思想,尽可能的节约资源。 体现在什么地方呢?看如下代码:
3.4 缓存的思想
单例模式的懒汉式实现还体现了缓存的思想,缓存也是实际开发中非常常见的功能。 简单讲就是,如果某些资源或者数据会被频繁的使用,而这些资源或数据存储在系统外部, ...
研磨设计模式之单例模式-2
- 博客分类:
- 设计模式
3 模式讲解
3.1 认识单例模式
(1)单例模式的功能 单例模式的功能是用来保证这个类在运行期间只会被创建一个类实例,另外单例模式还提供了一个全局唯一访问这个类实例的访问点,就是那个getInstance的方法。不管采用懒汉式还是饿汉式的实现方式,这个全局访问点是一样的。 对于单例模式而言,不管采用何种实现方式,它都是只关心类实例的创建问题,并不关心具体的业务功能。(2)单例模式的范围 也就是在多大范围内是单例呢? 观察上面的实现可以知道,目前Java里面实现的单例是一个ClassLoader及其子ClassLoader的范围 ...
模式3.研磨设计模式之单例模式-1
- 博客分类:
- 设计模式
单例模式(Singleton)
1 场景问题
1.1 读取配置文件的内容
考虑这样一个应用,读取配置文件的内容。 很多应用项目,都有与应用相关的配置文件,这些配置文件多是由项目开发人员自定义的,在里面定义一些应用需要的参数数据。当然在实际的项目中,这种配置文件多采用xml格式的。也有采用properties格式的,毕竟使用Java来读取properties格式的配置文件比较简单。 现在要读取配置文件的内容,该如何实现呢?
1.2 不用模式的解决方案
有些朋友会想,要读取配置文件的内容,这也不是 ...
研磨设计模式之装饰模式-4
- 博客分类:
- 设计模式
3.3 装饰模式和AOP
装饰模式和AOP在思想上有共同之处。可能有些朋友还不太了解AOP,下面先简单介绍一下AOP的基础知识。1:什么是AOP——面向方面编程 AOP是一种编程范式,提供从另一个角度来考虑程序 ...
研磨设计模式之装饰模式-3
- 博客分类:
- 设计模式
3 模式讲解
3.1 认识装饰模式
(1)模式功能 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象增加功能,相当于是改变了对象的外观。当装饰过后,从外部使用系统的角度看,就不再是使用原始的那个对象了,而是使用被一系列的装饰器装饰过后的对象。 这样就能够灵活的改变一个对象的功能,只要动态组合的装饰器发生了改变,那么最终所得到的对象的功能也就发生了改变。 变相的还得到了另外一个好处,那就是装饰器功能的复用,可以给一个对象多次增加同一个装饰器,也可以用同一个装饰器装饰不同的对象。
(2)对象组合 前面已经讲到了,一个 ...
研磨设计模式之装饰模式-2
- 博客分类:
- 设计模式
2 解决方案
2.1 装饰模式来解决
用来解决上述问题的一个合理的解决方案,就是使用装饰模式。那么什么是装饰模式呢?(1)装饰模式定义
(2)应用装饰模式来解决的思路 虽然经过简化,业务简单了很多,但是需要解决的问题不会少,还是要解决:要透明的给一个对象增加功能,并实现功能的动态组合。 所谓透明的给一个对象增加功能,换句话说就是要给一个对象增加功能,但是不能让这个对象知道,也就是不能去改动这个对象。而实现了能够给一个对象透明的增加功能,自然就能够实现功能的动态组合,比如原来的对象有A功能,现在透明的给它增加了一个B功能,是不是就相当于 ...
模式5.研磨设计模式之装饰模式-1
- 博客分类:
- 设计模式
装饰模式(Decorator)
1 场景问题
1.1 复杂的奖金计算
考虑这样一个实际应用:就是如何实现灵活的奖金计算。 奖金计算是相对复杂的功能,尤其是对于业务部门的奖金计算方式,是非常复杂的,除了业务功能复杂外,另外一个麻烦之处是计算方式还经常需要变动,因为业务部门经常通过调整奖金的计算方式来激励士气。 先从业务上看看现有的奖金计算方式的复杂性:
首先是奖金分类:对于个人,大致有个人当月业务奖金、个人累计奖金、个人业务增长奖金、及时回款奖金、限时成交加码奖金等等;
对于业务主管或者是业务经理,除了个人奖金外,还有 ...
研磨设计模式之简单工厂模式-3
- 博客分类:
- 设计模式
3 模式讲解
3.1 典型疑问
首先来解决一个常见的疑问:可能有朋友会认为,上面示例中的简单工厂看起来不就是把客户端里面的“new Impl()”移动到简单工厂里面吗?不还是一样通过new一个实现类来得到接口吗?把“new Impl()”这句话放到客户端和放到简单工厂里面有什么不同吗? 理解这个问题的重点就在于理解简单工厂所处的位置。 根据前面的学习,我们知道接口是用来封装隔离具体的实现的,目标就是不要让客户端知道封装体内部的具体实现。简单工厂的位置是位于封装体内的,也就是简单工厂是跟接口和具体的实现在一起的,算是封装体内部的一个类,所 ...
研磨设计模式之简单工厂模式-2
- 博客分类:
- 设计模式
2 解决方案
1 简单工厂来解决
用来解决上述问题的一个合理的解决方案就是简单工厂,那么什么是简单工厂呢?1:简单工厂定义
2:应用简单工厂来解决的思路 分析上面的问题,虽然不能让模块外部知道模块内的具体实现,但是模块内部是可以知道实现类的,而且创建接口是需要具体实现类的。 那么干脆在模块内部新建一个类,在这个类里面来创建接口,然后把创建好的接口返回给客户端,这样外部应用就只需要根据这个类来获取相应的接口对象,然后就可以操作接口定义的方法了。把这样的对象称为简单工厂,就叫Factory吧。 这样一来,客户端就可以通过这个F ...
模式6.研磨设计模式之简单工厂模式-1
- 博客分类:
- 设计模式
简单工厂
简单工厂不是一个标准的设计模式,但是它实在是太常用了,简单而又神奇,所以还是需要好好掌握的,就当是对学习设计模式的热身运动吧。 为了保持一致性,我们尽量按照学习其它模式 ...
今天在做jpa与spring整合时,发现个异常... 如下
异常内容:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [beans.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: No PersistenceProvi ...