使用继承时,定义父类为抽象类,同时在父类中实现一个公共的方法。所有继承该父类的子类。都有该方法。只要修改该父类的这个公共方法,会影响所有的子类。根据不同的需求,假如子类的该操作是同样的流程这样没有问题。但是在有些情况下,这个父类的公共方法只是该方法的一个抽象,具体实现在子类中。各个子类有自己实现方式。这样在父类中实现方法,一旦修改就会影响所有继承该父类的子类。所谓的溢出效应 就是指的是这个。假如只是在父类中定义方法,每个子类都要分别实现,即使假如有两个子类的该方法是同样的操作。这样无疑又增加了工作量和代码的复杂度。
策略模式指的是:把类的行为抽出来。不同的行为封装成不同的interface .针对一个行为的根据需求 假如有几个实现的话。那么每个实现就implements对应的interface。这样 不同的行为,同一行为不同的实现。可以完全独立。形成多策略。 举个栗子: 一个人的行为有:吃和睡 。吃,有人喜欢吃 萝卜,有人喜欢吃青菜。睡有人喜欢睡地板,有人喜欢睡床。 定义吃接口:
public interface EatBehavior{
void eat();
}
封装不同的吃行为:
public class EatLuoBoBehavior implements EatBehavior{
@Override
public void eat(){
System.out.println("eat luobo");
}
}
public class EatQingCaiBehavior implements EatBehavior{
@Override
public void eat(){
System.out.println("eat qing cai ");
}
}
定义睡接口
public interface SleepBehavior{
void sleep();
}
封装不同的睡行为
public class SleepDiBanBehavior implements SleepBehavior{
@Override
public void sleep(){
System.out.println("sleep di ban");
}
}
public class SleepBedBehavior implements SleepBehavior{
@Override
public void sleep(){
System.out.println("sleep bed");
}
}
好了 现在行为封装好了。
我们再实现一个 people的超类。在这个超类里面把不同的行为对象。 行为对象的值具体由具体的实例来赋值。
public abstract class People{
EatBehavior eatBehavior;
SleepBehavior sleepBehavior;
public void eat(){
eatBehavior.eat();
}
public void sleep(){
sleepBehavior.sleep();
}
public void SetEatBehavior(EatBehavior eatBehavior){
this.eatBehavior = eatBehavior;
}
public void SetSleepBehavior(SleepBehavior sleepBehavior){
this.sleepBehavior= sleepBehavior;
}
}
好了,现在封装一个策略模式为:一个喜欢吃萝卜 睡在地板上的人
public class LikeLuoBoAndDiBanPerson externds Person{
public LikeLuoBoAndDiBanPerson(){
eatBehavior = new EatLuoBoBehavior (); //父类类型的子类对象
sleepBehavior = new SleepDiBanBehavior ;
}
}
基于上面的这个栗子。可以封装多种行为模式的person。任意组合。 总结:把类的变化的行为 抽象成:接口+实现。好处就是在新增加行为时 简单方便,行为类的复用性好。组合起来方便。