疯子姓张

一定要站在巨人的肩膀上去学习。

导航

JAVA设计模式一策略模式(Strategy Pattern)

什么是设计模式?

就是一些经验。让程序代码更具弹性、好维护、代码复用的经验。而且设计模式都遵从一些OO设计原则。

题外话:以下罗列出常用的OO设计原则:链接

本文章介绍策略模式(Strategy Pattern)。

一、定义:

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

二、用到的设计原则:

1 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起

 

一般情况下,稳定的部分利用继承,变化的部分利用接口。

 

 

 

1 针对接口编程,而不是针对实现编程。

// Animal是一个接口  Dog 类实现了Animal接口
//针对实现编程
Dog d=new Dog();
//针对接口编程
Animal animal=new  Dog();

2 多用组合,少用继承。

某一个具体类的行为,不通过继承父类获得,也不通过直接实现接口获得。而是把接口作为变量定义在该具体类中,如果该具体类想要使用这个行为。
在调用这个具体类的时候,set这个接口的具体实现类对象进去,即可获得想要的行为。

 

三、例子:

题目:公司做了一套模拟鸭子的游戏:呱呱。游戏中会出现各种鸭子,一遍游泳戏水,一边呱呱叫。公司要求,让部分鸭子可以飞翔。鸭子的叫法各不相同,鸭子的飞翔姿势各不相同。试问,如何设计?

public abstract Class Duck{

//组合 FlyBehavior flyBehavior ; QuackBehavior quackBehavior;
public Duck(){} public void setFlyBehavior(FlyBehavior fb){ flyBehavior =fb; } public void setQuackBehavior(QuackBehavior qb){ quackBehavior=qb; }

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

}

public vod perfromQuack(){
quackBehavior.quack();
}
//稳定部分的代码在这里直接实现就好,直接让子类继承,提高代码复用。
//抽象类真的就是生来被用来继承的。为什么变化的部分不在这里写一个抽象方法,
//因为,写接口是为了复用。

}

}

public class GreenDuck extends Duck{

    public GreenDuck(){}

    public void display(){

        System.out.println("我是一只绿鸭子!!!");
   }
}

 

 

public interface FlyBehavior{
     public void fly(){};
}

public class Fly1 implements FlyBehavior{

    public void fly(){
         System.out.println("我正在用第一种方式飞翔!!!");
    }
}


public class Fly2 implements FlyBehavior{

    public void fly(){
         System.out.println("我正在用第二种方式飞翔!!!");
    }
}

 

 

 

public interface QuackBehavior{
     public void quack(){};
}

public class Quack1 implements QuackBehavior{

    public void quack(){
         System.out.println("我正在用第一种方式叫!!!");
    }
}


public class Quack2 implements QuackBehavior{

    public void quack(){
         System.out.println("我正在用第二种方式叫!!!");
    }
}

 

  

 

 

public class Test{
     
    public static void main(String[] args){
       //接口编程
       Duck duck=new GreenDuck();
       //组合的调用
       duck.setFlyBehavior(new Fly1());

       duck.performFly();
   }


}

 

 

 

四、个人理解:以上。

 

posted on 2018-05-30 16:03  菠萝奶油饭  阅读(127)  评论(0编辑  收藏  举报