现实中很多设备要根据某些数值来计算出其他值,如已知园的半径求其面积、已知三角形三边求其周长等等还有一些工艺设备也会用到此类方法,归根到底就是应用一个公式来算出相应的属性值。现在以三角形为例来学习此类问题的解决方法。

  基本需求:根据三边a、b、c求三角形周长。

  基本抽象:一个三角形类Triangle,有一个求周长的方法GetCirByABC();

  基本实现:

public class Triangle
{
    public double GetCirByABC(double a, double b, double c)
    {
        return a + b + c;
    }

}

基本不足:依照OO的抽象不应依赖细节,显然a、b、c以及返回值都定位到相应的属性了,违背了抽象不依赖细节原则,故应直接返回一个Triangle对象,他的好处之一就是需要什么值就通过属性来取相应的值,好处之二后面会提到。

改进后的实现:

public class Triangle
{
    public double A { get; set; }
    public double B { get; set; }
    public double C { get; set; }
    public double Cir { get; set; }

public Triangle GetModel(Triangle tg)
    {
        tg.Cir = tg.A + tg.B + tg.C;
        return tg;
    }

}

扩展需求:根据A和B边以及Cir周长求C边长度,看似直接增加一个方法即可解决。

public Triangle GetModel(Triangle tg)
{
    tg.C = tg.Cir - tg.A - tg.B;
    return tg;
}

可以观察到直接返回对象的好处二,不变的是抽象,只是算法发生了变化,由此策略模式应运而生。

策略模式(Strategy):他定义了一系列的算法,并将每一种算法封装起来,并且可以相互替换,新的算法诞生不会造成类结构的破坏,只是一种扩展而已。

策略抽象类定义:

abstract class Strategy
{
    public abstract Triangle GetModel(Triangle tg);
}

2个具体策略类定义CirByABCStrategy和CByCirABStrategy:

//根据周长和AB边求C
class CByCirABStrategy:Strategy
{
    public override Triangle GetModel(Triangle tg)
    {
        tg.C = tg.Cir - tg.A - tg.B;
        return tg;
    }
}
//根据ABC求周长
class CirByABCStrategy:Strategy
{
    public override Triangle GetModel(Triangle tg)
    {
        tg.Cir = tg.A + tg.B + tg.C;
        return tg;
    }
}

上下文类Context(保存一个策略类的引用)定义:

class Context
{
    private Strategy strategy;
    public Context(Strategy strategy)
    {
        this.strategy = strategy;
    }
    public Triangle ContextInface(Triangle tg)
    {
        return strategy.GetModel(tg);
    }
}

客户端求周长调用例子:

Triangle triangle = new Triangle();
triangle.A = 3;
triangle.B = 4;
triangle.C = 5;
Context context = new Context(new CirByABCStrategy());//这里决定调用具体的策略类,如果是根据AB和Cir来求则为new CByCirABStrategy();
Triangle tg = context.ContextInface(triangle);
Console.WriteLine("策略模式求周长:" + tg.Cir);

策略模式缺点:实施起来较复杂,如有N种设备,每种设备都存在这样的多种算法情况,可能某些设备存在三四种算法,那类的数量将是很大的。没有完美的设计只有适合的设计。

转载于:https://www.cnblogs.com/tianlong/archive/2010/07/17/1779351.html

从△走进OO,走进策略模式相关推荐

  1. 控制器框架Struts与策略模式那点事

    在写这篇文章之前,xxx已经写过了几篇关于改控制器框架主题的文章,想要了解的朋友可以去翻一下之前的文章 Struts1无疑是一个灰常经典的MVC框架,在Struts有前端控制器和业务控制器的概念.那么 ...

  2. Java 策略模式和状态模式

    本文是转载的,转载地址:大白话解释Strategy模式和State模式的区别 先上图: 本质上讲,策略模式和状态模式做得是同一件事:去耦合.怎么去耦合?就是把干什么(语境类)和怎么干(策略接口)分开, ...

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

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

  4. 四、设计模式——策略模式

    2019独角兽企业重金招聘Python工程师标准>>> 面向对象的设计方案 产品狗今天跟你说,要做一个"模拟鸭子游戏",需求如下: 鸭子有共同的功能,比如游泳和叫 ...

  5. 【HeadFirst 设计模式总结】1.策略模式

    1.书中举了一个鸭子类的设计,有些会飞或者会叫,有些不会飞可能也不会叫,用继承则导致不该有的功能通过继承而继承了下来,使用接口则代码无法做到最大程度的重用.进而引出设计原则1:找出应用中可能需要变化之 ...

  6. 设计模式(一)————策略模式(张三的故事??)

    引言 当我们完成一个复杂的业务中常常会面临一个问题:针对一个对象的某个行为,不同的情境下有不同的处理方式: 就比如今天我要去上班,那么我需要以哪种交通方式去上班呢?可以有下面几种选择: 步行 公交 地 ...

  7. python策略模式的应用_Head First 设计模式——策略模式(Strategy Pattern)——Python实现 | 学步园...

    作者:liuyuan_jq 2011-06-13 策略模式定义 定义了 问题 J o e 上班的公司做了一套相当成功的模拟鸭子游戏: SimUDuck.游戏中会出现各种鸭子,一边游泳戏水,一边呱 呱叫 ...

  8. Java 设计模式之策略模式

    一.了解策略模式 1.1 什么是策略模式 策略模式 (Strategy Pattern) 是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换.此模式让算法的变化独立于使用算法的客 ...

  9. Java的设计模式----strategy(策略模式)

    设计模式: 一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精 ...

  10. 设计模式随笔系列:鸭子-策略模式(Strategy)

    鸭子-策略模式(Strategy) 前言 万事开头难,最近对这句话体会深刻!这篇文章是这个系列正式开始介绍设计模式的第一篇,所以肩负着确定这个系列风格的历史重任,它在我脑袋里默默地酝酿了好多天,却只搜 ...

最新文章

  1. Android LruCache 压缩图片 有效避免程序OOM
  2. 阿里热更新android,阿里最新热更新使用采坑记录
  3. Android studio听云接入另外一种方式
  4. 2015年240个数据库引擎排名参考
  5. 如何参与一个GitHub开源项目
  6. paddlepaddle测试安装_百度paddlepaddle深度学习7日入门-CV疫情特辑心得
  7. 列表ls按照升序排列的python内置函数是_Python习题集
  8. java设计模式之行为型设计模式
  9. Vue模板 script部分
  10. 实战MongoDB-Replication之Master-Slave
  11. 域用户权限|连接DC终端服务
  12. 前端培训丁鹿学堂:nodeJS入门指南(一)
  13. SQL基础系列(三)——分组查询
  14. 【单片机学习笔记】上传一整年的自学电子笔记,互相交流,共同进步。
  15. 机器学习面试题60~100
  16. layui 表格时间显示问题
  17. 火箭是这样连胜的(转载)
  18. python找数字_python – 找到与给定数字最接近的数字
  19. 计算机系统应用软件的核心是什么,计算机系统软件的核心是什么?
  20. mp4格式-播放和断点续播

热门文章

  1. 怎么看mac电脑wifi密码?很简单!
  2. javascript 简易时钟
  3. 如何使用iMazing将iPhone的数据迁移到iPad
  4. Python 之 str 、 repr 、 反引号(``)的区别
  5. PHP 抽象工厂模式(Kit模式)
  6. centos免密登录
  7. 芯片领域再起风波 国内IC行业挑战来临
  8. 怎样利用JDBC启动Oracle 自己主动追踪(auto trace)
  9. 不购买2021新款MacBook Pro的理由
  10. ​​​​SSH Config Editor Pro :管理您的SSH配置文件