从△走进OO,走进策略模式
基本需求:根据三边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,走进策略模式相关推荐
- 控制器框架Struts与策略模式那点事
在写这篇文章之前,xxx已经写过了几篇关于改控制器框架主题的文章,想要了解的朋友可以去翻一下之前的文章 Struts1无疑是一个灰常经典的MVC框架,在Struts有前端控制器和业务控制器的概念.那么 ...
- Java 策略模式和状态模式
本文是转载的,转载地址:大白话解释Strategy模式和State模式的区别 先上图: 本质上讲,策略模式和状态模式做得是同一件事:去耦合.怎么去耦合?就是把干什么(语境类)和怎么干(策略接口)分开, ...
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式- Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 四、设计模式——策略模式
2019独角兽企业重金招聘Python工程师标准>>> 面向对象的设计方案 产品狗今天跟你说,要做一个"模拟鸭子游戏",需求如下: 鸭子有共同的功能,比如游泳和叫 ...
- 【HeadFirst 设计模式总结】1.策略模式
1.书中举了一个鸭子类的设计,有些会飞或者会叫,有些不会飞可能也不会叫,用继承则导致不该有的功能通过继承而继承了下来,使用接口则代码无法做到最大程度的重用.进而引出设计原则1:找出应用中可能需要变化之 ...
- 设计模式(一)————策略模式(张三的故事??)
引言 当我们完成一个复杂的业务中常常会面临一个问题:针对一个对象的某个行为,不同的情境下有不同的处理方式: 就比如今天我要去上班,那么我需要以哪种交通方式去上班呢?可以有下面几种选择: 步行 公交 地 ...
- python策略模式的应用_Head First 设计模式——策略模式(Strategy Pattern)——Python实现 | 学步园...
作者:liuyuan_jq 2011-06-13 策略模式定义 定义了 问题 J o e 上班的公司做了一套相当成功的模拟鸭子游戏: SimUDuck.游戏中会出现各种鸭子,一边游泳戏水,一边呱 呱叫 ...
- Java 设计模式之策略模式
一.了解策略模式 1.1 什么是策略模式 策略模式 (Strategy Pattern) 是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换.此模式让算法的变化独立于使用算法的客 ...
- Java的设计模式----strategy(策略模式)
设计模式: 一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精 ...
- 设计模式随笔系列:鸭子-策略模式(Strategy)
鸭子-策略模式(Strategy) 前言 万事开头难,最近对这句话体会深刻!这篇文章是这个系列正式开始介绍设计模式的第一篇,所以肩负着确定这个系列风格的历史重任,它在我脑袋里默默地酝酿了好多天,却只搜 ...
最新文章
- Android LruCache 压缩图片 有效避免程序OOM
- 阿里热更新android,阿里最新热更新使用采坑记录
- Android studio听云接入另外一种方式
- 2015年240个数据库引擎排名参考
- 如何参与一个GitHub开源项目
- paddlepaddle测试安装_百度paddlepaddle深度学习7日入门-CV疫情特辑心得
- 列表ls按照升序排列的python内置函数是_Python习题集
- java设计模式之行为型设计模式
- Vue模板 script部分
- 实战MongoDB-Replication之Master-Slave
- 域用户权限|连接DC终端服务
- 前端培训丁鹿学堂:nodeJS入门指南(一)
- SQL基础系列(三)——分组查询
- 【单片机学习笔记】上传一整年的自学电子笔记,互相交流,共同进步。
- 机器学习面试题60~100
- layui 表格时间显示问题
- 火箭是这样连胜的(转载)
- python找数字_python – 找到与给定数字最接近的数字
- 计算机系统应用软件的核心是什么,计算机系统软件的核心是什么?
- mp4格式-播放和断点续播
热门文章
- 怎么看mac电脑wifi密码?很简单!
- javascript 简易时钟
- 如何使用iMazing将iPhone的数据迁移到iPad
- Python 之 str 、 repr 、 反引号(``)的区别
- PHP 抽象工厂模式(Kit模式)
- centos免密登录
- 芯片领域再起风波 国内IC行业挑战来临
- 怎样利用JDBC启动Oracle 自己主动追踪(auto trace)
- 不购买2021新款MacBook Pro的理由
- ​​​​SSH Config Editor Pro :管理您的SSH配置文件