第1章 策略模式【StrategyPattern】
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。
先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜,用 JAVA 程序怎么表现这个呢?我们先看类图:
三个妙计是同一类型的东东,那咱就写个接口:
package com.cbf4life.strategy;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口*
*/
public interface IStrategy {//每个锦囊妙计都是一个可执行的算法
public void operate();}
第4页
然后再写三个实现类,有三个妙计嘛:
package com.cbf4life.strategy;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.* 找乔国老帮忙,使孙权不能杀刘备
*/
public class BackDoor implements IStrategy {
public void operate() {System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
}}
package com.cbf4life.strategy;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.* 求吴国太开个绿灯
*/
public class GivenGreenLight implements IStrategy {
public void operate() {System.out.println("求吴国太开个绿灯,放行!");
}}
package com.cbf4life.strategy;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.* 孙夫人断后,挡住追兵
*/
public class BlockEnemy implements IStrategy {public void operate() {
您的设计模式
第5页
您的设计模式
System.out.println("孙夫人断后,挡住追兵");}
}
好了,大家看看,三个妙计是有了,那需要有个地方放这些妙计呀,放锦囊呀:
package com.cbf4life.strategy;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.* 计谋有了,那还要有锦囊
*/
public class Context {//构造函数,你要使用那个妙计
private IStrategy straegy;
public Context(IStrategy strategy){
this.straegy = strategy;}
//使用计谋了,看我出招了public void operate(){
this.straegy.operate();}
}
然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老爷子去入赘了,嗨,还别说,小亮的三个妙计还真是不错,瞅瞅:
package com.cbf4life.strategy;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.*/
public class ZhaoYun {/**
* 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
*/
public static void main(String[] args) {Context context;
第6页
您的设计模式
//刚刚到吴国的时候拆第一个System.out.println("-----------刚刚到吴国的时候拆第一个-------------");context = new Context(new BackDoor()); //拿到妙计
context.operate(); //拆开执行System.out.println("\n\n\n\n\n\n\n\n");
//刘备乐不思蜀了,拆第二个了System.out.println("-----------刘备乐不思蜀了,拆第二个了-------------");context = new Context(new GivenGreenLight());
context.operate(); //执行了第二个锦囊了System.out.println("\n\n\n\n\n\n\n\n");
//孙权的小兵追了,咋办?拆第三个
System.out.println("-----------孙权的小兵追了,咋办?拆第三个-------------");
context = new Context(new BlockEnemy());context.operate(); //孙夫人退兵System.out.println("\n\n\n\n\n\n\n\n");
/**问题来了:赵云实际不知道是那个策略呀,他只知道拆第一个锦囊,
*而不知道是BackDoor这个妙计,咋办? 似乎这个策略模式已经把计谋名称写出来了*
* 错!BackDoor、GivenGreenLight、BlockEnemy只是一个代码,你写成first、second、third,没人会说你错!
*
* 策略模式的好处就是:体现了高内聚低耦合的特性呀,缺点嘛,这个那个,我回去再查查
*/
}}
就这三招,搞的周郎是“陪了夫人又折兵”呀!这就是策略模式,高内聚低耦合的特点也表现出来了,还有一个就是扩展性,也就是 OCP 原则,策略类可以继续增加下去,只要修改 Context.java 就可以了,这个不多说了,自己领会吧。
第1章 策略模式【StrategyPattern】相关推荐
- 第 25 章 策略模式
第 25 章 策略模式 1.编写鸭子项目 编写鸭子项目,具体要求如下: 有各种鸭子(比如野鸭.北京鸭.水鸭等, 鸭子有各种行为,比如叫.飞行等) 显示鸭子的信息 2.传统方案解决鸭子问题 传统方案解决 ...
- 策略模式(strategy-pattern)
策略模式(strategy-pattern) 文章目录 策略模式(strategy-pattern) 一.情景建立 二.剖析现存问题 三.策略模式 四.总结 五.补充 一.情景建立 假如现在有这样的需 ...
- 大话设计模式 第二章 策略模式购物车价格查询
策略模式定义 定义一系列功能 把它们一个个封装起来 并使它们可以相互替换 提供统一的入口访问包装的功能 问题 添加商品和优惠券到购物车后查询价格 思考 要想获取购物车的支付价格 需要经过所有的优惠券优 ...
- 【Head First 模式设计】第1章 策略模式
Intro to Design Patterns Welcome to Design Patterns SimUDuck应用程序 一个模拟鸭子游戏:SimUDuck.游戏中会出现各种鸭子,一边游泳,一 ...
- 第 1 章 策略模式
<?php header("Content-type: text/html; charset=UTF-8"); /** * 策略模式的好处就是:体现了高内聚低耦合的特性 */ ...
- 设计模式のStrategyPattern(策略模式)----行为模式
一.问题产生背景 当我们进行一系列处理时(员工工资核算,会员管理,计算器,优惠活动),会有很多相似的算法和处理过程,只是由于具体的算法的差异,导致必须不同处理.这些处理和客户端无关,我们可以把这些算法 ...
- 大话设计模式之爱你一万年:第十三章 行为型模式:策略模式:女友在手,说走就走:2.策略模式之出行旅游
要出行旅游,那么出行方式有--飞机.自驾游.火车.自行车等,这几种方式就是策略.我自己就不喜欢做攻略和计划,幸亏有我的女朋友. 一.策略模式之出行旅游 1.1 分析 对于出行方式可以抽象出来Vehic ...
- 大话设计模式之爱你一万年:第十三章 行为型模式:策略模式:女友在手,说走就走:3.策略模式之三国刘备江东娶夫人
这一节我们在通过一个三国之刘备江东娶夫人的例子来对策略模式有一个更深的理解. 一.策略模式之三国刘备江东娶夫人 1.1 故事背景 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天 ...
- python打折简单程序每满_[Python设计模式] 第2章 商场收银软件——策略模式
题目 设计一个控制台程序, 模拟商场收银软件,根据客户购买商品的单价和数量,计算总价. 基础版本 price = float(input("输入商品单价:")) number = ...
最新文章
- 如何使用PHP发送电子邮件?
- Assets.car 桌面解压工具
- golang goland报错错误 $GOPATH/go.mod exists but should not 解决方法
- js 根据所输内容生成助记码
- 【安全漏洞】ProxyShell漏洞复现详解
- 为什么按照 Angular 官网教程执行简单的测试代码,会遇到expect is not defined的错误消息
- C# WinForm 自启动/模拟开机自动启动
- Tomcat实战-调优方案
- android 区域交错,android - 自动调整交错GridLayoutManager - 堆栈内存溢出
- 导航抽屉(Google+与YouTube)
- linux下svn的用法
- 摩游世纪CEO宋啸飞:Html5增长趋势已可见
- 《从NLP反作弊技术看马蜂窝注水事件》笔记
- C语言打印九九乘法表
- win7查找计算机图片,win7系统全盘搜索图片的操作方法
- 21世纪的文件系统:概述WindowsNT 5.0文件系统(NTFS)(三)
- 求大于某一正整数的最小质数
- 如何只用三步就能快速写一个网页
- 百度地图API学习---隐藏百度版权标志
- 第5章 C语言的冒泡排序 (二)
热门文章
- c语言电子计算器课程设计报告,计算机程序设计课程设计报告.doc
- @scheduled 每30s 执行一次_全球首发5G神U麒麟820,荣耀30S卡位5G档位最强,售价2399起...
- 2019计算机科学与技术全日制调济,2019年华侨大学计算机科学与技术学院全日制学术型研究生调剂信息(第三批)...
- python time模块详解_py 模块之 time模块 讲解②
- the job was canceled什么意思_什么第三人称单数形式?怎么用?
- Android Studio 找不到EventBus/ButterKnife等第三方包解决方案
- JavaScript常用方法(工具类的封装)
- Nginx ab压力测试
- TCanvas 学习
- data too long for column 'Auser' at row 1