Java23种设计模式 策略模式【Strategy Pattern】
本文章转载大佬CBF4LIFE的文章 博客地址:https://www.cnblogs.com/cbf4life/
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,
嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子
的。
先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊
里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜,用 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();
}
然后再写三个实现类,有三个妙计嘛:
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() { 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; //刚刚到吴国的时候拆第一个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 就可以了,这
个不多说了,自己领会吧。
Java23种设计模式 策略模式【Strategy Pattern】相关推荐
- 解读设计模式----策略模式(Strategy Pattern)
一.模式概述 策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法. 在我应 ...
- 关于设计模式——策略模式-Strategy Pattern
文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...
- 设计模式——策略模式( Strategy Pattern )
写代码超过千行,自定义类10个以上,往往写着写着就觉的乱,最终决定抽空补习下设计模式方面的知识.本来AS3出了本关于设计模式的书的,国人也翻译了.我同事也早早买了一本,但前些天我借来看了几页,翻译的太 ...
- 设计模式-策略模式(Strategy Pattern)
Define a family of algorithms,encapsulate each one,and make them interchangeable(定义一组算法,将每个算法都封装起来,并 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了"工厂模式"."策略模式" ...
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式- Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 设计模式-策略模式(Strategy)-Java
设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...
- 李建忠设计模式——策略模式Strategy
目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...
最新文章
- JAVA操作properties文件
- Linux Unix C 中的curses库——curses.h
- 计算机网络一些重要的知识
- Python中JSON的基本使用
- Shell编程——shell常用命令
- lol最克制诺手的英雄_上路克制诺手的英雄,他只需要平A就好了!
- ChronicleMap –具有堆外内存的Java体系结构
- 2021年12月Python小屋编程比赛获奖名单
- 试戴系统完全开放—zoomla!逐浪cms在后4.6时代的又一个亮点
- 【AI手机三国杀】三星Bixby闯入战场,AI功能集成颠覆人机交互
- 数据结构上机实践第八周项目8-稀疏矩阵的三元组表示的实现及应用
- 协同过滤工具源码下载
- webservice视频教程-基于SOA 思想下的WebService实战
- c语言 最大子段和,最大子段和 C语言源码
- api.php(260x260),Restful Api文档 -V3-教程
- Ubuntu 16.04 中文输入法(搜狗输入法)安装记录
- 书店销售系统java代码,VC书店销售管理系统源代码(源码大小6M)
- 微软鼠标测试软件,微软Precision鼠标评测:Surface生产力工具最佳搭配
- 禅道的测试模块(bug模块)
- scau 18924 二叉树的宽度
热门文章
- 淘宝商品优化多少分合格?店铺品质分如何优化?
- 最简单的三层神经网络Matlab实现
- spring boot多数据源动态切换, 多数据源事务管理
- 开源作者丢了个炸弹,记colors.js与faker.js事件
- 2021新区一中高考成绩查询,2021高考什么时候出成绩 多久能查分
- 清理eclipse中得缓存
- (五)SSO之CAS框架单点登录, session超时, ajax链接处理
- “堵城”伦敦如何规划未来交通?
- 在龙芯3B1500上编译安装ICESTORM (open source platform for lattice ICE40 serial FPGA)
- linux给目录赋访问权限_【Linux】Linux系统中的权限详解