设计模式原则
- 不变的和变化的分开。
- 针对接口编程,而不针对实现编程。
- 多考虑组合,而不是继承。
策略模式
定义算法族,分别封装,使之可以相互替换,此模式让算法的变化独立于使用算法的客户。
例
最典型的鸭子问题
比如:鸭子是一类,有普通鸭子,模型鸭子,野鸭等,按照设计模式的第一个原则来考虑,那么鸭子时不变的,变化的是鸭子的一些行为比如叫,飞,速度等等。
这样的话我们就需要有一个不变的类:鸭子类,和一些变化的类:飞,叫,所以我们的飞和叫不加在鸭子的类中
但是所有的鸭子都会有一定的外观,展示出来;
鸭子类
public class Duck{
public abstract void display();
}
根据第二个原则我们要针对接口,而不针对实现,那么我们飞和叫就要,并应该放在接口中;
飞
public interface FlyBehavior {
public void fly();
}
叫
public interface QuackBehavior {
public void quack();
}
那么在我举例中 我们有两种鸭子一种是绿头鸭子,可以飞,也可以叫,一种普通的模型鸭子不会飞,但是可以叫。
绿头鸭子
public class MallardDuck extends Duck{
@Override
public void display(){
System.out.println("I'm a real Mallard duck");
}
}
模型鸭子
public class ModelDuck extends Duck{
@Override
public void display() {
System.out.println(" i'm a model duck ");
}
}
那么我们的绿头鸭子又有那些行为呢?我们距离了两种行为,1,可以叫,2可以飞,那么我们就要有2个实现
可以飞
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {
System.out.println("I'm flying!!");
}
}
可以叫
@Override
public void quack() {
System.out.println("Quack");
}
同理我们的模型鸭子不会飞但是可以叫
吱吱叫
public class Squeak implements QuackBehavior{
@Override
public void quack() {
System.out.println(" Squeak ");
}
}
不会飞
public class FlyNoWay implements FlyBehavior{
@Override
public void fly() {
System.out.println("I'm can't fly !!");
}
}
现在我们的准备工作准备完成了。那么设计模式的第三个原则,组合我们又要怎么使用呢?这里就要接种我们的 多态 来操作了。
我们先来改造一下我们的鸭子类,让我们的鸭子类具有飞,和叫的基础。
public abstract class Duck {
public FlyBehavior flyBehavior;
public 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 void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
这样我们的绿头鸭子和模型鸭子已经具有了飞和叫的行为,那么行为方式又该是什么样呢?多态 就体现在这里了
绿头鸭子
package one;
public class MallardDuck extends Duck{
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
@Override
public void display(){
System.out.println("I'm a real Mallard duck");
}
}
模型鸭子
package one;
public class ModelDuck extends Duck{
public ModelDuck(){
flyBehavior = new FlyNoWay();
quackBehavior = new Squeak();
}
@Override
public void display() {
System.out.println(" i'm a model duck ");
}
}
编写测试类
public class MiniDuckSimulator {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
Duck modelDuck = new ModelDuck();
modelDuck.performFly();
modelDuck.performQuack();
}
}
这样的组合,我们的鸭子就实现了不同的行为方式。我们把鸭子一系列行为定义成算法族,分别封装,这样就符合了策略模式。
扩展 我们改装了模型鸭子之后,增加了一个飞行器,他会飞了,我们想让他在运行的时候动态改变飞的方式又要怎么做呢?
ps: 上边类中有提示的!!!想要源码的可以私聊我,或者自己复制上面的内容。