开篇说明:
今天看到一本国内程序员CBF4LIFE写的设计模式一书,感觉非常有趣味性,非常容易理解,特此分享给大家!建议大家对照着GOF的《设计模式》一书看。
下面我们开始第一篇--策略模式。
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,
嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子
的。
先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊
里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜,用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();
}
}
然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老
爷子去入赘了,嗨,还别说,小亮的三个妙计还真是不错,瞅瞅:
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. 提高代码复用性:设计模式是经过验证的解决方案,可以避免重复发明轮子,减少代码量。 2. 提升代码可读性:遵循统一的设计模式,使得代码具有更高的可读性,便于团队协作。 3. 提高软件可维护性:良好的设计模式...
### 32种设计模式趣谈 #### 一、创建型模式 1. **Factory (工厂模式)** - **定义**: 工厂模式是一种创建型设计模式,它提供了创建对象的最佳方式。此模式的核心思想是将对象的创建与使用分离,即消费者只需知道...
关于Java23种设计模式的有趣见解,是一个深入浅出探讨设计模式在实际场景中应用的例子集合。设计模式是软件工程中的重要概念,旨在解决软件开发中常见的问题,提高代码的复用性和可维护性。以下是对给定文件中提及的...
本讲座“014-趣谈网络协议”旨在深入浅出地探讨这个关键领域,帮助我们理解网络背后的运作机制。 首先,我们要了解网络协议的核心概念。在计算机网络中,数据通信依赖于一系列标准和规范,这就是网络协议。最著名的...
### 《电子入门趣谈》第六章-制作机器人 #### 6.1 浅谈机器人 在本章节中,我们将探讨机器人技术的基础概念,并重点介绍竞赛机器人的制作过程。首先,我们需要澄清一个普遍的认知误区:机器人并非总是拥有科幻电影...
在《电子入门趣谈》第八章中,读者将接触如何利用Matlab进行数字信号处理图形用户界面(GUI)的设计。本章旨在帮助初学者通过实际操作加深对数字信号处理的理解,同时熟悉Matlab这一强大的工具。 ##### 任务要求: ...
风水趣谈--家庭卧室风水布置六大禁忌.doc
05-趣谈网络协议
计算机网络技术基础-趣谈网络协议.md
《英语词源趣谈》这本资料正是为此目的而编撰,它通过趣味性的讲解,使枯燥的词汇学习变得生动有趣。 首先,词源学可以帮助我们理解词汇的形态变化。英语中的许多词汇都源于古英语、拉丁语、希腊语等其他语言,这些...
三角形趣谈
数学科普、陈景润、数论
### 趣谈C语言和JAVA中的++和-- #### 引言 在计算机编程语言的学习过程中,`++`(自增)和`--`(自减)运算符是非常基础且重要的概念之一。无论是在C语言还是Java语言中,这两种运算符都有着广泛的用途,并且能够...
《趣谈数据结构(五)》探讨了计算机程序设计中的一个重要算法——递归。递归算法是一种较难理解和掌握的技巧,它通过过程自身调用来实现自我嵌套执行。递归执行的流程可以用图形化的方式来表示,就像图1所示,呈现...
趣谈大数据 一、大数据的初步理解 似乎一夜之间,大数据(Big Data)变成一个IT行业中最时髦的词汇。 首先,大数据不是什么完完全全的新生事物,Google的搜索服务就是一个典型的大数据运用,根据 客户的需求,Google...
2. `_.findLastIndex(array, [predicate=_.identity], [fromIndex=array.length-1])`: 从右侧开始返回第一个指定断言为 `true` 的数组元素的索引。 3. `_.indexOf(array, value, [fromIndex=0])`: 根据指定位置,...
目录 00开篇词:想成为技术牛人?先搞定网络协议! 01为什么要学习网络协议? 02网络分层的真实含义是什么? 03ifconfig:最熟悉又陌生的命令行 04DHCP与PXE:IP是怎么来的,又是怎么没的?...05从物理层到MAC层 ...
Linux操作系统是一种自由、开源的操作系统,它基于Unix系统设计,由林纳斯·托瓦兹在1991年首次发布。Linux操作系统的核心是内核,它负责管理系统的硬件资源,调度进程,以及确保多任务的顺利运行。Linux的开放源码...
1. **床的位置不宜直对门**:床头不应正对着卧室门,因为这样会形成“门冲”,让人感觉缺乏安全感,影响睡眠质量。同时,床的摆放也应避免背对门,以防“背后无靠”,象征着得不到支持和帮助。 2. **镜子不宜直照床...
在编程世界里,C语言以其高效、灵活的特点深受程序员喜爱,而指针是C语言中的一个核心概念,它使得程序能够...通过不断的实践和探索,你会发现指针的妙用无穷,正如标题所言,"C语言-- 指针经典趣谈",乐趣与挑战并存。