最近看Head Frist设计模式一书,对设计模式的一点记录,供自己以后查阅,首先学习的是策略模式,策略模式的好处:策略模式的好处在于你可以动态的改变对象的行为
策略模式的设计原则:将一个类中经常改变或者可能要改变的部分提取出来作为一个接口,然后在类中声明这个接口的实例,声明方法可以改变这个实例,这样类就可以调用实现这个接口类的方法。
就以书中例子说明:
我们有父类鸭子(Duck),鸭子有很多,如正常的鸭子,橡皮鸭子,鸭子共同点:身体两只腿,颜色,行为(飞,叫),因为有些鸭子是会飞的,有些不会飞,有些会呱呱叫,有些会吱吱叫,那么鸭子的行为就是变化的,因此我们抽取这些变化的部分作为接口。
飞行接口:
public interface IFly {
public void fly();
}
叫接口:
public interface IQuack {
public void quack();
}
父类Duck:
public abstract class Duck {
private IFly mIFly;
private IQuack mIQuack;
public void setmIFly(IFly iFly)
{
mIFly=iFly;
}
public void setmIQuack(IQuack iQuack)
{
mIQuack=iQuack;
}
public void exectFly()
{
if(mIFly!=null)
mIFly.fly();
}
public void exectQuack()
{
if(mIQuack!=null)
mIQuack.quack();
}
public void body()
{
System.out.println("I have a body and two legs!");
}
public abstract void dispaly();
}
子类RedDuck:
public class RedDuak extends Duck {
@Override
public void dispaly() {
System.out.println("I am red duck!");
}
}
public class EraserDuck extends Duck {
@Override
public void dispaly() {
System.out.println("I am yello duck!");
}
}
fly行为类:
public class FlyByWings implements IFly {
@Override
public void fly() {
System.out.println("fly by wings!");
}
}
呱呱叫行为类:
public class GuaGua implements IQuack {
@Override
public void quack() {
System.out.println("gua gua jiao!");
}
}
吱吱叫行为类:
public class ZhiZhi implements IQuack {
@Override
public void quack() {
System.out.println("zhi zhi jiao!");
}
}
测试一下:
public static void main(String args[])
{
Duck readDuck =new ReadDuck();
readDuck.body();
readDuck.setmIFly(new FlyByWings ());
readDuck.setmIQuack(new GuaGua());
readDuck.exectQuack();
readDuck.exectFly();
Duck eraserDuck=new EraserDuck();
eraserDuck .body();
eraserDuck.setQuack(new ZhiZhi());
eraserDuck.exectQuack();
}
这样我们可以动态的改变各种鸭子的行为,例如我们的RedDuck又会叽叽叫,这也说不准,那么我们可以创建JiJi类实现IQuack
JiJi类实现quack方法,把这JiJi类传给RedDuck实例,RedDuck就可以调用JiJi实现的quack()方法实现叽叽叫了。