策略模式:定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换。
这种设计模式的原理是将所有的策略抽象出来,形成一个接口,利用接口的多态,以及context来进行分离。这样子做的目的是,当你多了一种策略的时候,只需要新增加你的策略类。对整个代码没有进行破坏,也不需要新增其他地方的代码实现了开闭原则,也进行了解耦。以鸭子作为实例。
- 首先我们要有个鸭子类,鸭子类作为超类,可以定义为抽象类,Duck类中将飞行封装到两个行为类中,在以后可以轻易地改动或扩充行为而不影响其他部分,系统更有弹性。这种方式体现了2个特点
(1). 使用组合不使用继承,将鸭子的飞通过组合的形式,让系统具有弹性
(2).面向接口编程,实现了解耦。
Duck类
public abstract class Duck {
FlyBehavior flyBehavior;
public Duck() {
}
// 动态设置飞行行为
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}
abstract void display();
// 将飞行行为委托给飞行行为类处理
public void performFly() {
flyBehavior.fly();
}
}
- 实现飞的接口和叫的接口。这个时候是具体类了,可能飞行声有多种,我们可以实现几种。
FlyWithWings用翅膀飞类
public class FlyWithWings implements FlyBehavior{
public void fly() {
System.out.println("I'm flying!!");
}
}
FlyNoWay不会飞类
public class FlyNoWay implements FlyBehavior {
public void fly() {
System.out.println("I can't fly");
}
}
3.实现了飞行的具体实现类之后,要去实现具体鸭子的具体类,继承鸭子这个抽象类。在这个具体类中可以在构造函数中初始化飞行行为。
红头鸭子类
public class RedHeadDuck extends Duck {
@Override
void display() {
System.out.println("I'm a real Red Headed duck");
}
//构造函数中默认实现的飞行属性为翅膀飞行
public RedHeadDuck() {
flyBehavior = new FlyWithWings();
}
}
4.在测试类中实例化这个红头鸭类,发现实例化之后,他就具有了飞行的行为。也可以通过setFlyBehavior()方法修改红头鸭的飞行行为。
测试类
public class Demo {
public static void main(String[] args) {
//实例化一只红头鸭
RedHeadDuck redHeadDuck = new RedHeadDuck();
//输出鸭子的类型
redHeadDuck.display();
//输出红头鸭的飞行属性
redHeadDuck.performFly();
//修改他的飞行属性
redHeadDuck.setFlyBehavior(new FlyNoWay());
//输出鸭子的类型
redHeadDuck.display();
//输出红头鸭的飞行属性
redHeadDuck.performFly();
}
}
显示结果

网友评论