您的位置:首页 > 其它

设计模式学习笔记(1):策略模式

2018-02-26 11:20 281 查看
策略模式
一、策略模式的定义:
       策略模式是指对一系列的算法进行定义,并将每一个算法进行封装,使它们可以相互替换。算法独立于使用它们的客户变化。
二、策略模式的应用场景:
      “什么”做“什么”,而后面这个动作是可变的。

       多个类只区别在表现行为不同(多个类里面中的某些个方法不同),则可以使用策略模式,在运行时我们即可以动态选择具体执行的行为。

       在没有策略模式之前,在面对多个类存在行为不同,我们可能会选择继承(extends)的方式,然后用重写的方式去覆盖超类的行为。但是这种方法会存在问题:
1.如果存在某些类的某些方法相同,这样会造成代码在多个子类中重复;
2.运行时,行为无法改变;
3.代码扩展时,不容易实现;

这时候我们就可以采用策略模式。我们先把找出应用中可能需要变化的地方独立出来,也就是上面所说需要重写的部分

拿head first的例子来说
Duck有哪些品种呢,ModelDuck和MallardDuck(ModelDuck IS-A Duck,MallardDuck IS-A Duck)

Duck有哪些方法呢,飞,游泳,叫(Duck HAS-A fly,Duck HAS-A quack,Duck HAS-A swim):
1.飞,有些鸭子就不会飞,有些鸭子用翅膀飞(MallardDuck),有些用火箭飞(模型鸭ModelDuck),
2.游泳,基本都会。
3.叫,叫声又各有不同。
在例子中我们将fly(),quack()视为可变的(我们在这里主要讨论fly()),swim()视为不变的,将可变方法和不变方法分离。我们将可变的方法设置为接口,而swim()不用去管。
quack接口public interface QuackBehavior {
void quack();
}
fly接口
public interface FlyBehavior {
void fly();
}
MallardDuck用翅膀飞,ModelDuck用火箭飞,用两个fly()方法去实现这个接口public class FlyWithWings implements FlyBehavior {
@Override
public void fly(){
System.out.println("用翅膀飞");
}
}
public class FlyRocketPowered implements FlyBehavior {
@Override
public void fly(){
System.out.println("用火箭飞");
}
}
下面来写父类Duckpublic class Duck {
//fly()的接口
FlyBehavior flyBehavior;
//squack()的接口
QuackBehavior quackBehavior;

//setFlyBehavior()方法来动态改变fly()
public void setFlyBehavior(FlyBehavior fb){
flyBehavior = fb;
}
//setQuackBehavior()方法动态改变quack()
public void setQuackBehavior(QuackBehavior qb){
quackBehavior = qb;
}

//具体运行quack()
public void performQuack(){
quackBehavior.quack();
}
//具体运行fly()
public void performFly(){

4000
flyBehavior.fly();
}

//不变的swim()
public void swim(){
System.out.println("游泳");
}
//不变的display()
public void display(){
System.out.println("我是一只鸭子");
}
}ModelDuck子类public class ModelDuck extends Duck {

}
MallardDuck子类public class MallardDuck extends Duck {

}
运行public class RunProgram {
public static void main(String[] args) {

Duck model = new ModelDuck();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();

Duck mallard = new MallardDuck();
mallard.setFlyBehavior(new FlyWithWings());
mallard.performFly();
}
}结果:



我们运用了策略模式可以使得我们得以在运行时动态改变方法,就不需要在每个Duck子类中Override fly()方法了,同时提高了我们代码的复用,便于我们后期的扩展
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: