一:策略模式(Strategy Pattern)
定义了算法镞,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
二:设计原则
多用组合 少用继承
三:实例
1.代码目录
/**
* 模拟调用鸭子(策略模式--startegy pattern)
*/
public class MiniDuckSimulator {
//主方法
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
mallard.display();
mallard.swim();
}
}
/**
* 鸭子的抽像类
*/
public abstract class Duck {
FlyBehavior flyBehavior;//飞的行为
QuackBehavior quackBehavior;//叫的行为
public abstract void display();
public void performFly() {
flyBehavior.fly();
};
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("All ducks float,even decoys");
}
}
/**
* “叫” 的行为接口 *
*/
public interface QuackBehavior {
public void quack();
}
/**
* “飞”的行为接口 *
*/
public interface FlyBehavior {
public void fly();
}
/**
*
*带翅膀的 飞的具体实现类
*/
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("I'm flying !");
}
}
/**
*呱呱叫 叫的具体实现类
*/
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("Quack ");
}
}
/**
* 绿头鸭的实列
*/
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();//会呱呱叫
flyBehavior = new FlyWithWings();//会用翅膀飞
}
@Override
public void display() {
System.out.println("I am a real Mallard duck");
}
}
执行结果:
以上代码 就可以创建 一只绿头鸭的对象了
如要扩展 不同飞行实现 和 不同叫声的实现 只需分别实现各自的接口
如拓展 出不会飞的,和只能沉默的鸭子
/**
* 飞的接口 不会飞的实现类
*/
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("I can not fly");
}
}
/**
* 叫的接口 沉默的实现
*/
public class MuteQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("<< Slience >>");
}
}
这样可以各种组合 成不同行为的各类鸭子实体
/**
* 玩具鸭 不会飞 不会叫
*/
public class ToyDuck extends Duck {
public ToyDuck() {
quackBehavior = new MuteQuack();//会呱呱叫
flyBehavior = new FlyNoWay();//会用翅膀飞
}
@Override
public void display() {
System.out.println("I am a real Mallard duck");
}
}
设计模式 所涉及的代码和知识点 均来自以下参考书籍
本人尽将自己的学习内容整理在此,方便自己和大家一起查阅。
若要转载,复制粘贴 请标明来源。
《Head Firsts设计模式》