【Head First设计模式-读书笔记】策略模式
策略模式定义了算法族,分别封装起来,让它们可以相互替换,此模式让算法的变化独立于算法的用户。
对于一个已经抽象出来的抽象类如果想要再向它的子类增加功能,这个功能有不同的实现,那么直接在抽象类里加一个功能,然后子类重写,或者给子类加上一个该功能的借口。都可以实现,但是如果很大一部分子类都具有相同的功能那么代码的复用率就会很低。
所以只在抽象类里定义一个功能借口的对象(相当于挂了一个钩子),然后用另外的类来实现功能接口,这样子类只需要挑选不同功能而不需要考虑功能的实现。
栗子:
有一个鸭子的抽象类(右say,fly功能),我们把它们分离出来单独实现;
package com.ztc.duck;
import com.ztc.fly.Iflyable;
import com.ztc.say.Isayable;
/**
* Created by ztc on 15-11-18.
*/
public abstract class duck {
//功能借口
Iflyable f;
Isayable s;
public duck(){
}
public Isayable getS() {
return s;
}
public void setS(Isayable s) {
this.s = s;
}
public Iflyable getF() {
return f;
}
public void setF(Iflyable f) {
this.f = f;
}
public void fly(){
f.fly();
}
public void say(){
s.say();
}
}
2.写接口的不同实现
package com.ztc.say;
/**
* Created by ztc on 15-11-18.
*/
public interface Isayable {
public void say();
}
package com.ztc.say;
/**
* Created by ztc on 15-11-18.
*/
public class sayType1 implements Isayable {
@Override
public void say() {
System.out.println("I'm Say 1");
}
}
package com.ztc.say;
/**
* Created by ztc on 15-11-18.
*/
public class sayType2 implements Isayable {
@Override
public void say() {
System.out.println("I'm Say 2");
}
}
package com.ztc.say;
/**
* Created by ztc on 15-11-18.
*/
public class sayType3 implements Isayable{
@Override
public void say() {
System.out.println("I'm Say 3");
}
}
3.写不同的子类就可以选择不同的功能而不用管功能的实现,提高了代码的复用率
package com.ztc.duck;
import com.ztc.fly.flyType1;
import com.ztc.say.sayType3;
/**
* Created by ztc on 15-11-18.
*/
public class duckType1 extends duck {
public duckType1(){
f=new flyType1();
s=new sayType3();
}
}
package com.ztc.duck;
import com.ztc.fly.flyType2;
import com.ztc.say.sayType1;
/**
* Created by ztc on 15-11-18.
*/
public class duckType2 extends duck {
public duckType2(){
f=new flyType2();
s=new sayType1();
}
}