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

策略模式

一、策略模式的定义:

       策略模式是指对一系列的算法进行定义,并将每一个算法进行封装,使它们可以相互替换。算法独立于使用它们的客户变化。

二、策略模式的应用场景:

      “什么”做“什么”,而后面这个动作是可变的。

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


       在没有策略模式之前,在面对多个类存在行为不同,我们可能会选择继承(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("用火箭飞");
    } 
}

下面来写父类Duck

public 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(){
        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()方法了,同时提高了我们代码的复用,便于我们后期的扩展



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值