OO设计模式笔记01—策略模式

OO设计模式—策略模式

设计原则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:多用组合,少用继承。

策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值