关于设计模式:设计模式策略模式

35次阅读

共计 2462 个字符,预计需要花费 7 分钟才能阅读完成。

策略模式:
定义了算法簇,别离封装起来,让它们之间能够相互替换,此模式让算法的变动能够独立于算法的客户。

具体实例:
当初咱们要创立各种鸭子对象,这些鸭子有者不同的行为能力,会叫的,会飞的,不会叫的,不会飞的,飞得很快像火箭一样的等等。

咱们首先剖析鸭子的能力次要有两种,叫与飞。因而咱们将这两种能力剥离进去,定义为了接口。叫的差异化在叫的具体行为类来实现。飞的差异化能力在飞的具体类实现。

这样咱们就将接口与实现拆散了。

行为接口就像是一类算法,具体的行为类就是这类算法的差异化实现。当要扩大这类算法时,只须要增加新的行为类。

代码样例:

 飞动作的行为接口
public interface FlyBehavior {public void fly();
}
 叫动作的行为接口

public interface QuackBehavior {public void quack();
}
 飞的具体行为类 1

public class FlyNoWay implements  FlyBehavior{
    @Override
    public void fly() {System.out.println("i cant not fly");
    }
}
 飞的具体行为类 2

public class FlyWithWings implements  FlyBehavior{
    @Override
    public void fly() {System.out.println("i am flying");
    }
}
 飞的具体行为类 3

public class FlyWithRocket implements FlyBehavior{
    @Override
    public void fly() {System.out.println("i am flying with rocket");
    }
}

叫的具体行为类 1

public class MuteQuack implements QuackBehavior{
    @Override
    public void quack() {System.out.println("silence");
    }
}

叫的具体行为类 2

public class Quack implements  QuackBehavior{
    @Override
    public void quack() {System.out.println("quack: gua gua gua");
    }
}

抽象类 Duck 是具备叫和航行为的一类对象,咱们将 Duck 定义为了抽象类,在该类中蕴含了行为接口,通过行为接口对具体行为类的援用(多态),达到了行为的多态实现。

public abstract class Duck {
    // 行为接口
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;
    public void performFly(){flyBehavior.fly();
    }
    public void performQuack(){quackBehavior.quack();
    }

    // 赋予飞这个具体动作类的援用
    public void setterFlyBehavior(FlyBehavior flyBehavior){this.flyBehavior = flyBehavior;}

     // 赋予叫这个具体动作类的援用
    public void setterQuackBehavior(QuackBehavior quackBehavior){this.quackBehavior = quackBehavior;}

    public abstract void display();}
 鸭子对象:通过构造函数填充鸭子的行为

public class ModelDuck extends Duck{
    // 在鸭子的结构器内实例化鸭子的行为
    public ModelDuck(){this.flyBehavior = new FlyNoWay();
        this.quackBehavior = new MuteQuack();}

    @Override
    public void display() {System.out.println("i am a model duck");
    }
}


通过 set 办法赋予鸭子的行为。public class NewModelDuck extends Duck{
    @Override
    public void display() {System.out.println("i am a new duck");
    }
}
 测试:public class DuckSimulator {public void duckConstructBehavior() {Duck model = new ModelDuck();
        model.performFly();
        model.performQuack();}

    public void duckSetterBehavior(){Duck newModelDuck = new NewModelDuck();
        newModelDuck.setterFlyBehavior(new FlyWithRocket());
        newModelDuck.setterQuackBehavior(new Quack());
        newModelDuck.performQuack();
        newModelDuck.performFly();}
}

import junit.framework.TestCase;

public class DuckSimulatorTest extends TestCase {
    private
    DuckSimulator duckSimulator = new DuckSimulator();

    public void testDuckConstructBehavior() {duckSimulator.duckConstructBehavior();
    }

    public void testDuckSetterBehavior() {duckSimulator.duckSetterBehavior();
    }
}

测试后果:

i am a model duck
i cant not fly
silence
i am a new duck
quack: gua gua gua
i am flying with rocket

正文完
 0