常用设计模式 策略模式

策略模式

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

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();
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 9,403评论 1 15
  • 目录 本文的结构如下: 引言 什么是策略模式 模式的结构 典型代码 代码示例 策略模式和模板方法模式的区别 优点和...
    w1992wishes阅读 4,379评论 1 7
  • 本文首发于个人博客:Lam's Blog - 谈谈23种设计模式在Android源码及项目中的应用,文章由Mark...
    格子林ll阅读 10,129评论 1 105
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,887评论 1 32
  • 我,是一只黄莺, 被困在牢笼里, 这里是我的回避, 也是我毕生的牢地。 我有着莹亮的歌喉, 众人都追捧我, 他们觊...
    喵爱眨眼睛阅读 3,017评论 2 5

友情链接更多精彩内容