标签:src extends 相关 desc system test alt latest 优点
策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,是一种对象行为型模式。
Context(环境角色):持有抽象策略角色的引用
Strategy(抽象策略角色):给出所有具体策略类所需的接口
ConcreteStrategy(具体策略角色):包装了相关的算法或行为
鸭子分为野生和家养,野生鸭子会飞,而家养鸭子不会飞。使用策略模式来是实现,可以将「飞」定义为一个抽象策略,具体策略就是「会飞」、「不会飞」
1、抽象策略角色
public interface FlyBehavior {
void fly();
}
2、具体策略角色
public class CanFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println("可以飞");
}
}
public class NotFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println("不会飞");
}
}
3、环境角色
//鸭子类
public abstract class Duck {
private FlyBehavior flyBehavior;
public Duck(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void fly(){
flyBehavior.fly();
}
public abstract void description();
}
//野生鸭子
public class WildDuck extends Duck {
public WildDuck(FlyBehavior flyBehavior) {
super(flyBehavior);
}
@Override
public void description() {
System.out.println("我是野生鸭子");
}
}
//家养鸭子
public class DomesticDuck extends Duck {
public DomesticDuck(FlyBehavior flyBehavior) {
super(flyBehavior);
}
@Override
public void description() {
System.out.println("我是家养鸭子");
}
}
4、测试类
public class Client {
@Test
public void test(){
Duck duck1 = new WildDuck(new CanFlyBehavior());
duck1.description();
duck1.fly();
Duck duck2 = new DomesticDuck(new NotFlyBehavior());
duck2.description();
duck2.fly();
}
}
5、运行结果
我是野生鸭子
可以飞
我是家养鸭子
不能飞
优点:
缺点:
适用场景:
参考:https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/strategy.html
标签:src extends 相关 desc system test alt latest 优点
原文地址:https://www.cnblogs.com/songjilong/p/12902813.html