demo描述:有不同种类的鸭子,它们的飞行能力不同
demo代码:
鸭子类:
public abstract class Duck {
//策略接口
FlyBehavior flyBehavior;
public Duck() {
}
public abstract void display();
public void quack(){
System.out.println("鸭子嘎嘎叫");
}
public void swim(){
System.out.println("鸭子会游泳");
}
public void fly(){
if (flyBehavior!=null){
flyBehavior.fly();
}
}
}
//----------------------------------------------
public class ToyDuck extends Duck{
public ToyDuck(){
flyBehavior=new NoFlyBehavior();
}
@Override
public void display() {
System.out.println("玩具鸭");
}
@Override
public void quack() {
System.out.println("玩具鸭不能叫");
}
@Override
public void swim() {
System.out.println("玩具鸭不能游泳");
}
}
public class PekingDuck extends Duck{
public PekingDuck(){
flyBehavior=new NoFlyBehavior();
}
@Override
public void display() {
System.out.println("北京鸭");
}
}
public class WildDuck extends Duck{
public WildDuck(){
flyBehavior=new GoodFlyBehavior();
}
@Override
public void display() {
System.out.println("这是野鸭");
}
}
飞的能力:
public interface FlyBehavior {
void fly();
}
//-------------------------------
public class NoFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println("不会飞");
}
}
public class BadFlyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println("飞得一般");
}
}
public class GoodFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println("飞翔技术高超");
}
}
客户端:
public class Client {
public static void main(String[] args) {
WildDuck wildDuck=new WildDuck();
wildDuck.fly();
ToyDuck toyDuck=new ToyDuck();
toyDuck.fly();
}
}
demo类图:
类图分析:第一眼有没有感觉像桥接模式的类图?没错,类图是一样的,只不过桥接是不同属性对多个功能表现不同,策略是类的某些功能表现不同(在这里只写了飞的功能),将这些功能拆分出去延迟到子类实现,让其可以相互替换,动态改变对象行为;1,2处均可扩展。
适用场景:从备用方案中选一个用,方案会经常变动时用,如:结账方式、优惠政策等模型
总结:策略模式侧重点在运行时行为可变;桥接模式侧重点在属性分离,分别扩展,以达到类的多样化。