Spring中依赖注入的方式有两种:使用setter方法注入和使用构造器注入
第一种:set方法和构造器 -- 基本属性的注入
set注入是一种直接方式,缺点是它假设了所有的可变属性都可以通过set方法访问到。例如有些属性在创建时设置一次,以后不再改变。
首先创建一个类,类名为PersonServiceBean.java,代码为:
package cn.csdn.hr.service; import java.util.Date; publicclass PersonServiceBean { //封装属性 private String name; private String sex; private Integer age; private Date birth; public PersonServiceBean() { super(); // TODO Auto-generated constructor stub } public PersonServiceBean(String name, String sex, Integer age, Date birth) { super(); this.name = name; this.sex = sex; this.age = age; this.birth = birth; } //setter方法来依赖注入 publicvoid setName(String name) { this.name = name; } publicvoid setSex(String sex) { this.sex = sex; } publicvoid setAge(Integer age) { this.age = age; } publicvoid setBirth(Date birth) { this.birth = birth; } @Override public String toString() { return"PersonServiceBean [name=" + name + ", sex=" + sex + ", age=" + age + ", birth=" + birth + "]"; } }
在xml中用set方法注入,xml的名字为beanset.xml:
编程之美上面有个NIM的游戏,规则如下:
有n堆石头,两个人轮流从中取,一次只能在一堆中取,至少取一个,最多把这一堆取完,取得最后一个石头的人胜利,问谁有必胜策略。
解:
设这n堆石头的个数分别是X1,X2……Xn,设F(X)= X1 ^X2 ^ X3……^Xn。如果F(X)= 0则后取的获胜,否则,先取的获胜。
证明:
如果这剩下的石头的个数的的异或值为0,则无论从一堆中取多少个,取完之后剩下的异或值一定不是0,反之,如果异或值不为0,那么一定可以从一堆中取一些,从而使取完之后的异或值为0.
但是,有一个似乎更难的题目,就是有n堆石头,两个人轮流从中取,一次只能在一堆中取,至少取一个,最多把这一堆取完,取得最后一个石头的人输,问谁有必胜策略。
这个题目的结果与上面完全相同。
证明如下:
显然,如果某一个人取之前面临的状态是k,1,1,1,1…1,也就是除了一堆不是1,其它的都是1,则这个人一定会胜利,因为这个人可以保证取完之后每一堆剩下的数目都是1,并且还有奇数个,然后这个人一定胜利。
在游戏开始的时候,如果F(x)=0,则说明第一个人取完之后,F(x)!=0,所以,说明第一个人取完之后游戏的状态不可能全部是1,这样,在第二个人思考的时候,如果此时他面临的状态是k,1,1,…1,则它一定胜利,否则他就从一堆中取,从而使取完之后F(x)=0,这样一直下去,也就是说,最后出现的k,1,1,1…1 一定是第二个人首先看到,这样他一定胜利。
反之,如果F(x)!= 0,则如果第一个人面临的状态是k,1,1,1…1,则他一定胜利,否则,他可以保证自己取之后使F(x)=0,显然,F(x)=0的时候一定不可能是k,1,1,1…1的状态,也就是说,状态k,1,1,1..1这种状态永远不是第二个人会碰到的,于是,总会到一定时候,第一个人在自己取的时候面临着k,1,1,1..1的状态。当然,如果第一个人取的时候不是k,1,1,1..1的状态,他就应该使自己取完之后F(x)=0。
证明完毕
版权所有,各位如果转载请标明出处。谢谢
本文参考自《设计模式-可复用面向对象的基础》,《Java与模式》,《模式-工程化实现及扩展》
一、作用把一个类的接口变换成客户端所期待的另一种接口,从而使因接口不匹配而无法在一起工作的两个类能够在一起工作(Gang of four)。
二、角色1.Target:客户端期望的新接口。
2.Adaptee:需要被适配的目标类型,比较老的类型。
3.Adapter:完成对Adaptee到Target的转化。
1.类的适配器模式
2.对象的适配器模式
1.ITarget
package com.jue.test; public interface ITarget { public void newRequest(); }
2.Adaptee
package com.jue.test; public class Adaptee { public void oldRequest() { } }
3.类适配器
package com.jue.test; public class Adapter1 extends Adaptee implements ITarget { @Override public void newRequest() { super.oldRequest(); } }
4.对象适配器
package com.jue.test; public class Adapter2 implements ITarget { private Adaptee adaptee; public Adapter2(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void newRequest() { adaptee.oldRequest(); } }四、使用场景
1.想使用一个已经存在的类,而它的接口不符和新的需求。
2.(对象适配器)想要使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。