设计模式学习笔记:策略模式
Posted 滴滴哒滴哒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式学习笔记:策略模式相关的知识,希望对你有一定的参考价值。
策略模式
一、策略模式的定义:
策略模式是指对一系列的算法进行定义,并将每一个算法进行封装,使它们可以相互替换。算法独立于使用它们的客户变化。
二、策略模式的应用场景:
“什么”做“什么”,而后面这个动作是可变的。
多个类只区别在表现行为不同(多个类里面中的某些个方法不同),则可以使用策略模式,在运行时我们即可以动态选择具体执行的行为。
在没有策略模式之前,在面对多个类存在行为不同,我们可能会选择继承(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()方法了,同时提高了我们代码的复用,便于我们后期的扩展
以上是关于设计模式学习笔记:策略模式的主要内容,如果未能解决你的问题,请参考以下文章
尚硅谷设计模式学习(23)---[策略模式(strategy pattern)]