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

时间:2023-01-26 14:11:35

什么是设计模式?

就是一些经验。让程序代码更具弹性、好维护、代码复用的经验。而且设计模式都遵从一些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();
} }

四、个人理解:以上。