首页 > 代码库 > 策略模式

策略模式

策略模式定义:

分别封装行为接口,实现算法集合,超类存放行为接口对象,子类设置行为对象实现对象。

原则:

分离变化部分,封装为接口,基于接口编程,将行为算法独立出行为使用者

UML图表示:

技术分享

 

设计说明:

假设设计一个旅行的超类,其中每个人的旅行的交通工具是变化的,那么每个人的交通工具都不同可以分为几类,例如做飞机的,自驾游的,火车的,大巴的。每一类的业务逻辑都是一样的,此刻如果用简单的继承方式,每个人继承旅行Travel这个超类的话,那么将会出现代码不可重用,每个子类都必须重写toTravelPlace{}方法,代码无法实现重用,当然还有个问题,假设Travel超类,根据业务需要,需要增加一个方法,加上抽象buyInsurance()方法,为每次旅行购买保险,那么所有继承Travel类的之类都需要调整方法,而使用策略模式这种组合方式的话,可以很容易解决这个问题。

参考代码:

超类:

public abstract class Travel {
    public TravelStrategy myTravelStrategy;

    public void toTravelPlace() {
        myTravelStrategy.arrvie();
    };
    
    public void setTravelStrategy(TravelStrategy myTravelStrategy){
        myTravelStrategy=myTravelStrategy;
        
    };
}

实现类:

public class XiaoMingTravel extends Travel {
    public XiaoMingTravel(){
        myTravelStrategy=new CarTravel();
        
    }

}

策略接口类:

public interface TravelStrategy {
    public void  arrvie();

}

策略实现类1:

public class AirTravel implements TravelStrategy {

    @Override
    public void arrvie() {
        System.out.println("Booking airline tickets");
        
    }

}

策略实现类2:

public class CarTravel implements TravelStrategy {

    @Override
    public void arrvie() {
        System.out.println("prepare a car!");
        System.out.println("prepare a driving license!");
    }

}

测试类:

public class test {
    public static void main(String[] args) {
        XiaoMingTravel xmt = new XiaoMingTravel();
        xmt.toTravelPlace();
        // 可以基于父类暴漏的方法,随时更换方法
        // xmt.setTravelStrategy(new AirTravel());
        // xmt.toTravelPlace();
    }

}

 

策略模式