常用设计模式 策略模式

策略模式

策略模式专注于对象行为。

UML 示例

策略模式.png

组成

  1. 抽象策略角色
  2. 具体策略角色
  3. 环境角色

下面,结合UML示例图,并以乘坐交通工具去大理为例,解释下策略模式的组成部分。

抽象策略角色

策略类,通常由一个接口或者抽象类实现。通常,策略类中会定义一些动作/行为,但是并不关注这些动作/行为怎么实现。

按照上面的例子,TrafficTool就是策略类,该类种只定义了goDali方法。但是并没有实现该方法。

/**
* 交通工具
*/
public abstract class TrafficTool{
    public void goDali();
}

具体策略角色

具体策略类,是策略类的具体实现,通常会继承或者实现策略类。

按照上面的例子,高铁、飞机、汽车3个子类就是我们所说的具体策略角色,它们都实现了策略类中所定义的行为/动作,即它们都实现了去大理的过程。示例代码如下:

/**
 * 飞机
 */
public class Plane extends TrafficTool{
    public void goDali(){
        //购买机票
        buyPlaneTicket();
        ...
    }
}

/**
 * 高铁
 */
public class HighSpeedRail extends TrafficTool{
    public void goDali(){
        //购买火车票
        buyRailTicket();
        ...
    }
}

/**
 * 汽车-自驾
 */
public class car extends TrafficTool{
    public void goDali(){
        //检查汽油是否足够
        checkOil();
        ...
    }
}

环境角色

环境角色中持有一个策略类的引用,给需要的调用者调用。
按照上面的的例子,环境类中就是Person类,Person类有一个私有属性trafficTooltrafficTool即是我们所说的策略类(TrafficTool类)的引用。环境角色代码如下:

public class Person{

    private TrafficTool trafficTool;

    Person(TrafficTool trafficTool){
        this.trafficTool = trafficTool;
    }
    ... 
}

环境角色调用者

作为环境角色调用者,我们需要指明乘坐哪种交通工具去大理,而非由策略类或者环境类决定。示例代码如下:

//乘坐高铁去大理
Person person = new Person(new HighSpeedRail());
person.getTrafficTool().goDali();

你可能感兴趣的:(常用设计模式 策略模式)