您的位置:首页 > 其它

设计模式一:策略模式

2017-04-25 13:04 218 查看

一.策略模式中用到的设计原则

1.找出代码中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起.
2.针对接口编程,而不是实现编程

二.策略模式

1.概念

定义了算法族,分别分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

2.为什么使用策略模式

如果现在有一个超类Duck(鸭子),该鸭子有飞,叫等行为,现在我们要实现两个子类,这两个子类也要有飞,叫等行为,那我们直接继承此超类Duck即可,但现在需要一个会呱呱叫或者嘎嘎叫的子类,总之和超叫的行为有差异,那我们可以在写一个子类,重写其超类的叫方法,如果还有其它的变化,那么要写很多的子类,非常麻烦。
下面我们使用策略模式来解决
策略模式把其变化的部分和不变的部分分开,上述代码中变化的部分是鸭子的行为,所以我们把鸭子的行为提出来,用接口和实现类的方式来表示。

三.代码

超类:

public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;

public Duck(){
flyBehavior = new FlyNoWay();
quackBehavior= new Quack();
}

public void performFly(){
flyBehavior.fly();
}

public void performQuack(){
quackBehavior.quack();
}

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 interface FlyBehavior {
public void fly();
}

叫行为接口:
public interface QuackBehavior {
public void quack();
}

飞行为两个实现类:
public class FlyNoWay implements FlyBehavior {

@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I can't fly");
}
}
public class FlyWithWings implements FlyBehavior {

@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I'm  fly");
}

}


叫行为两个实现类:
public class MuteQuack implements QuackBehavior {

@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("Mute Quack");
}

}
public class Quack implements QuackBehavior {

@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("quack");
}

}


子类:
public class MinaDuck extends Duck {
public static void main(String[] args) {
//默认的行为
MinaDuck minaDuck= new MinaDuck();
minaDuck.performFly();
minaDuck.performQuack();
//当行为改变时,不需要其重新继承Duck,生成其子类,只要其设置不同的行为即可
FlyBehavior flyBehavior = new FlyWithWings();
minaDuck.setFlyBehavior(flyBehavior);
minaDuck.performFly();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: