定义:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
类图:
![](https://img.haomeiwen.com/i12239156/b1e7cf050deabaac.png)
事例:模拟鸭子应用
鸭子的外表,游泳,叫声,飞行等行为。
并不是所有的鸭子都会飞行,并不是所有鸭子的叫声都一样,所以把鸭子的叫声和飞行行为都抽象出来。
飞行行为的接口
public interface FlyBehavior {
void fly();
}
鸣叫行为的接口
public interface QuackBehavior {
void quack();
}
实现接口,列举可能的行为。
飞行行为的实现
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("I can't fly");
}
}
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("I'm flying !!");
}
}
鸣叫行为的实现
public class MuteQuack implements QuackBehavior {
@Override
public void quack(){
System.out.println("<< slience >>");
}
}
```public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("Quack");
}
}
public class Squeak implements QuackBehavior {
@Override
public void quack(){
System.out.println("Squeak");
}
}
鸭子的抽象类:
public abstract class Duck {
private FlyBehavior flyBehavior;
private QuackBehavior quackBehavior;
public void setFlyBehavior(FlyBehavior flyBehavior){
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior){
this.quackBehavior = quackBehavior;
}
public abstract void dispaly();
public void performFly(){
this.flyBehavior.fly();
}
public void performQuack(){
this.quackBehavior.quack();
}
public void swim(){
System.out.println("All ducks can swim");
}
}
通过set方法可以动态改变鸭子的行为
鸭子的具体实现类
public class MallardDuck extends Duck {
MallardDuck(){
setFlyBehavior(new FlyWithWings());
setQuackBehavior(new Quack());
}
@Override
public void dispaly() {
System.out.println("I'm a mallard duck");
}
}
测试类
public class Test {
public static void main(String[] args){
MallardDuck mallardDuck = new MallardDuck();
mallardDuck.performFly();
mallardDuck.performQuack();
mallardDuck.swim();
mallardDuck.dispaly();
mallardDuck.setFlyBehavior(new FlyNoWay());
mallardDuck.performFly();
}
}
可以将每组行为看成一个算法族。
网友评论