策略模式:定义算法族,分别封装起来、让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
针对接口编程与针对实现编程的区别:
A:针对实现编程:
Dog dog = new Dog() ;
dog.run();
B:针对接口编程:
Animal animal = new Dog();
animal.run();
策略模式简单例子如下:
说明:
1、抽象类:
Public abstract class Dog{
// 跳跃行为接口
JumpBehavior jumpBehavior:
// 奔跑行为接口
RunBehavior runBehavior;
public dog(){};
public abstract void display();
public void playRun(){
runBehavior.run();
}
public void playJump() {
runBehavior.jump();
}
// 构造方法
public void setJumpBehavior(JumpBehavior jumpBehavior1){
this.jumpBehavior = jumpBehavior1
}
public void setRunBehavior(RunBehavior runBehavior1){
this.runBehavior = runBehavior1
}
}
// 海狗不能跑,不能跳
Public class SeaDog extends Dog{
public SeaDog(){
jumpBehavior = new NoJumpDog();
// 奔跑行为接口
runBehavior = new NoRunDog();
};
public void display() {
System.out.println("I am seaDog");
}
}
//正常狗能跑,能跳
Public class NorDog extends Dog{
public NorDog(){
// 通过接口访问到跳的实现类
jumpBehavior = new JumpDog();
// 通过接口访问到跑的实现类
runBehavior = new RunDog();
};
public void display() {
System.out.println("I am normal Dog");
}
}
// 模型狗不能跑,不能跳
Public class ModelDog extends Dog{
public ModelDog(){
jumpBehavior = new NoJumpDog();
// 奔跑行为接口
runBehavior = new NoRunDog();
};
public void display() {
System.out.println("I am ModelDog");
}
}
2、行为接口
Public interface JumpBehavior {
public void jump();
}
Public interface RunBehavior {
public void run();
}
// 可以跳的
Public class CanJumpDog implements JumpBehavior{
public void jump() {
System.out.println("I can jum");
;
}
// 不能跳的
Public class NoJumpDog implements JumpBehavior{
public void jump() {
System.out.println("I can't jum");
}
}
;
// 可以跑的
Public class CanRunDog implements RunBehavior{
public void run() {
System.out.println("I can Run");
}
}
// 不能跑的
Public class NoRunpDog implements RunBehavior{
public void run() {
System.out.println("I can't Run");
}
}
测试运行代码:
Public Class testDog{
Public static void mail(String[] args){
Dog dog = new NorDog();
dog.playRun();//输出能跑
dog.playJump();//输出能跳
Dog dog = new ModelDog();
dog.playRun();//输出不能跑
dog.playJump();//输出不能跳
JumpBehavior canJump = new CanJumpDog();
// 输入可跳行为
dog.setJumpBehavior(canJump)
dog.playJump();//输出能跳
}
}
总结:少用继承、多用组合。