本文主要用作学习记录,参考headfirst设计模式
设计原则:找出应用中可能需要变化之外,把它们独立出来,不要和那些不需要变化的代码混在一起
设计原则:针对接口编程,而不是针对实现编程设计原则:多用组合,少用继承
策略模式定 义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
Strategy(策略)
作用:提供不同的算法
JDK中的体现:ThreadPoolExecutor中的四种拒绝策略
//定义飞行属性,因为不是所有的鸭子都会飞
public interface FlyBehavior {
public void fly();
}
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 interface QuackBehavior {
public void quack();
}
public class Quack implements QuackBehavior{
@Override
public void quack() {
System.out.println("Quack");
}
}
public class Qqueak implements QuackBehavior {
@Override
public void quack() {
System.out.println("Squeak");
}
}
public class MuteQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println(" Silence ");
}
}
//抽象类,所有的鸭子都有飞及叫的属性,但是不代表他们会飞或会叫
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck(){
}
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 FlyBehavior getFlyBehavior() {
return flyBehavior;
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public QuackBehavior getQuackBehavior() {
return quackBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
//继承象类,实例化模型鸭子
public class ModelDuck extends Duck {
public ModelDuck(){
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("I'm a model duck");
}
}
public class TestDuck {
public static void main(String[] args) {
Duck duck = new ModelDuck();
duck.performFly();
duck.performQuack();
duck.display();
}
}