OO设计模式—策略模式
设计原则tip1:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
如果每次新的需求依赖,都会使某方面的代码发生变化,那么你就可以确定,这部分的代码需要被抽出来,和其他稳定的代码有所区分。
考虑一个个经典的例子
Duck类中有fly和quack两种行为,但是不同的鸭子有不同的fly和quack行为。为了要把这个行为从Duck类中分开,我们将把他们从Duck类中取出来,建立一组新类来代表每个行为。
设计原则tip2:针对接口编程,而不是针对实现编程。这里的接口可以理解为接口interface或是抽象类。
在上面的问题中,我们利用接口代表每个行为,比方说,FlyBehavior与QuackBehavior,而行为的每个实现都将实现其中的一个借口。
这次鸭子类不会负责实现Flying与Quacking接口,反而是由我们实现FlyBehavior与QuackBehavior,这就称为“行为”类。由行为类来实现接口。
看以下代码:
Duck类
好了,现在模拟有两种鸭子:
如果需要添加飞行方式只需要定义新的行为类来实现飞行接口。
设计原则tip3:多用组合,少用继承。
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计原则tip1:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
如果每次新的需求依赖,都会使某方面的代码发生变化,那么你就可以确定,这部分的代码需要被抽出来,和其他稳定的代码有所区分。
考虑一个个经典的例子
Duck类中有fly和quack两种行为,但是不同的鸭子有不同的fly和quack行为。为了要把这个行为从Duck类中分开,我们将把他们从Duck类中取出来,建立一组新类来代表每个行为。
设计原则tip2:针对接口编程,而不是针对实现编程。这里的接口可以理解为接口interface或是抽象类。
在上面的问题中,我们利用接口代表每个行为,比方说,FlyBehavior与QuackBehavior,而行为的每个实现都将实现其中的一个借口。
这次鸭子类不会负责实现Flying与Quacking接口,反而是由我们实现FlyBehavior与QuackBehavior,这就称为“行为”类。由行为类来实现接口。
看以下代码:
Duck类
public abstract class Duck {
FlyBehavior flyBehavior;
QuckBehavior quackBehavior;
public Duck(){
}
public abstract void display();
public void performFly(){
flyBehavior.fly();
}
public void performQuack(){
quackBehavior.quack();
}
public void swim(){
System.out.println("All ducks floats,even decoys");
}
public void setFlyBehavior(FlyBehavior fb){
flyBehavior = fb;
}
public void setQuackBehavior(QuckBehavior qb){
quackBehavior = qb;
}
}
Fly接口和Quack接口:
public interface FlyBehavior {
public void fly();
}
public interface QuckBehavior {
public void quack();
}
实现两种行为的具体行为类:
public class FlyingWithWings implements FlyBehavior{
public void fly(){
System.out.println("I am flying!");
}
}
public class FlyingNoWay implements FlyBehavior {
public void fly(){
System.out.println("I cannot fly!");
}
}
public class Quack implements QuckBehavior{
public void quack(){
System.out.println("Quack");
}
}
public class MuteQuack implements QuckBehavior{
public void quack(){
System.out.println("<silence>");
}
}
好了,现在模拟有两种鸭子:
public class MallardDuck extends Duck {
public MallardDuck(){
quackBehavior = new Quack();
flyBehavior = new FlyingWithWings();
}
public void display(){
System.out.println("I am a real mallard duck");
}
}
public class MuteDuck extends Duck{
public MuteDuck(){
flyBehavior = new FlyingNoWay();
quackBehavior = new Quack();
}
public void display(){
System.out.println("I am a Mute Duck");
}
}
public class MiniDuckSimu {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
Duck Mute = new MuteDuck();
Mute.performFly();
Mute.performQuack();
}
}
如果需要添加飞行方式只需要定义新的行为类来实现飞行接口。
设计原则tip3:多用组合,少用继承。
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。