什么是设计模式?

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

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

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

一、定义:

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

二、用到的设计原则:

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

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

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

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

2 多用组合,少用继承。

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

三、例子:

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

  1. public abstract Class Duck{

  2. //组合
  3. FlyBehavior flyBehavior ;
  4. QuackBehavior quackBehavior;
  5.  
  6. public Duck(){}
  7.  
  8. public void setFlyBehavior(FlyBehavior fb){
  9. flyBehavior =fb;
  10. }
  11.  
  12. public void setQuackBehavior(QuackBehavior qb){
  13. quackBehavior=qb;
  14. }
  15.  
  16. public void performFly(){
    flyBehavior.fly();
  17.  
  18. }
  19.  
  20. public vod perfromQuack(){
    quackBehavior.quack();
    }
  1. //稳定部分的代码在这里直接实现就好,直接让子类继承,提高代码复用。
  2. //抽象类真的就是生来被用来继承的。为什么变化的部分不在这里写一个抽象方法,
  3. //因为,写接口是为了复用。
  4. }
  5. }
  1. public class GreenDuck extends Duck{
  2.  
  3. public GreenDuck(){}
  4.  
  5. public void display(){
  6.  
  7. System.out.println("我是一只绿鸭子!!!");
  8. }
  9. }
  1. public interface FlyBehavior{
  2. public void fly(){};
  3. }
  4.  
  5. public class Fly1 implements FlyBehavior{
  6.  
  7. public void fly(){
  8. System.out.println("我正在用第一种方式飞翔!!!");
  9. }
  10. }
  11.  
  12. public class Fly2 implements FlyBehavior{
  13.  
  14. public void fly(){
  15. System.out.println("我正在用第二种方式飞翔!!!");
  16. }
  17. }
  1. public interface QuackBehavior{
  2. public void quack(){};
  3. }
  4.  
  5. public class Quack1 implements QuackBehavior{
  6.  
  7. public void quack(){
  8. System.out.println("我正在用第一种方式叫!!!");
  9. }
  10. }
  11.  
  12. public class Quack2 implements QuackBehavior{
  13.  
  14. public void quack(){
  15. System.out.println("我正在用第二种方式叫!!!");
  16. }
  17. }

  

  1. public class Test{
  2.  
  3. public static void main(String[] args){
  4. //接口编程
  5. Duck duck=new GreenDuck();
  6. //组合的调用
  7. duck.setFlyBehavior(new Fly1());
  8.  
  9. duck.performFly();
  10. }
  11.  
  12. }

四、个人理解:以上。

JAVA设计模式一策略模式(Strategy Pattern)的更多相关文章

  1. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  2. 反馈法学习设计模式(一)——策略模式Strategy Pattern

    简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...

  3. JAVA设计模式之策略模式 - Strategy

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  4. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式… Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  5. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...

  6. 设计模式原来如此-策略模式(Strategy Pattern)

    策略模式中体现了两个非常基本的面向对象设计的原则:1.封装变化的概念.2.编程中使用接口,而不是对接口的实现. 策略模式的定义:定义一组算法,将每个算法都封装起来,并使它们之间可以互换.策略模式使这些 ...

  7. 【UE4 设计模式】策略模式 Strategy Pattern

    概述 描述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法的变化不会影响到使用算法的客户. 套路 Context(环境类) 负责使用算法策略,其中维持了一 ...

  8. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  9. 设计模式 - 策略模式(Strategy Pattern) 具体解释

    策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...

  10. HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)

    策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...

随机推荐

  1. SQL注入之Sqli-labs系列第三十六关(基于宽字符逃逸GET注入)和三十七关(基于宽字节逃逸的POST注入)

    0X1 查看源码 function check_quotes($string) { $string= mysql_real_escape_string($string); return $string ...

  2. vim分屏操作

    启动分屏 1.使用大写O参数进行垂直分屏 $ vim -On file1 file2 ... 2.使用小写o参数进行水平分屏 $ vim -on file1 file2 ... 注: n是数字,表示分 ...

  3. C/C++ 宏技巧

    1. C 也可以模板化 #define DEFINE_ARRAY_TYPE(array_type_, element_type_) \ static inline int array_type_ ## ...

  4. python 参数传递 传值还是传引用

    个人推测结论: 可变对象传引用,不可变对象传值 python里的变量不同于c中地址储值模型 a=100 b=100 print(id(a),id(b),a==b,a is b) #8790877986 ...

  5. BAT批处理文件,脚本时间值%time:~0,2%%time:~3,2%%time:~6,2%的用法。

    最近公司的项目,需要部署一个oracle定时备份脚本,删除掉特定时间前的备份文件.BAT批处理文件结合windows系统(任务计划程序) 正常情况下我们的任务计划会有反馈数值,通过它可以判断这个任务计 ...

  6. sails.js mvc framework learning

    目的:加快开发速度,总结使用方法: menu list: custom controller custom 模块使用 custom model custom middleware custom ser ...

  7. 【python接口自动化-requests库】【二】requests库简单使用(入门)

    一.post请求 前面讲了,我们get请求的时候,引入requests的包,然后直接使用get方法,那么post是不是一样的? 1.首先我们先引入requests import requests 2. ...

  8. python pytz时区设置模块

    如果你的程序要考虑时区,可以使用pytz.pytz官方文档:http://pytz.sourceforge.net/我使用的python版本:3.7.1 datetime模块中有tzinfo相关的东西 ...

  9. Linux tmpwatch命令详解

    Linux tmpwatch命令 Linux tmpwatch命令用于删除暂存文件. 执行tmpwatch指令可删除不必要的暂存文件,您可以设置文件超期时间,单位以小时计算 用法: tmpwatch ...

  10. vld for memory leak detector (release version)

    有没有这样的情况,无法静态的通过启动和退出来查找内存泄露,比如网络游戏,你总不能直接关游戏那玩家怎么办? 现在vld支持release,我们可以动态的找. 1.在release版本使用vld了.< ...