Java设计模式(15)——行为模式之策略模式(Strategy)
一、概述
概念

UML简图

角色

二、实践
我们先将上述的UML图的抽象情况下的代码写出,然后再给出一个具体的例子
策略接口——当然如果有一些公共的行为,应当使用抽象类!
/**
* 策略接口
*
* @author Administrator
**/
public interface Strategy {
void strategyMethod();
}
具体策略实现
/**
* 具体策略
*
* @author Administrator
**/
public class ConcreteStrategy implements Strategy{
@Override
public void strategyMethod() {
// 算法逻辑
}
}
环境
/**
* 环境
*
* @author Administrator
**/
public class Context {
private Strategy strategy; public Context(Strategy strategy) {
this.strategy = strategy;
}
public void contextMethod() {
strategy.strategyMethod();
}
/*请勿将模式拘泥于形式
public void method(Strategy strategy) {
strategy.strategyMethod();
}*/
}
我们稍加改造,改成一个具体的计算加减法的例子
/**
* 策略接口
*
* @author Administrator
**/
public interface Strategy {
int calc(int a, int b);
}
/**
* 加法策略
*
* @author Administrator
**/
public class PlusStrategy implements Strategy{
@Override
public int calc(int a, int b) {
return a + b;
}
}
/**
* 减法策略
*
* @author Administrator
**/
public class MinusStrategy implements Strategy{
@Override
public int calc(int a, int b) {
return a- b;
}
}
/**
* 环境
*
* @author Administrator
**/
public class Context {
private Strategy strategy; public Context(Strategy strategy) {
this.strategy = strategy;
}
public int calc(int a, int b) {
return strategy.calc(a, b);
}
}
这样,我们就可以在客户端通过环境调用了!
/**
* 客户端
* @author Administrator
**/
public class Client {
public static void main(String[] args) {
Context context = new Context(new PlusStrategy());
System.out.println(context.calc(1, 2));
Context context1 = new Context(new MinusStrategy());
System.out.println(context1.calc(2, 1));
}
}
当然,我们之前在Java8章节已经提到过,这样导致出现了很多实现类,单从语法层面上是可以改为拉姆达表达式的:
public static void main(String[] args) {
Context context = new Context((a, b)-> a+b);
System.out.println(context.calc(2, 3));
}
Java设计模式(15)——行为模式之策略模式(Strategy)的更多相关文章
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- 【java设计模式】(7)---策略模式(案例解析)
策略模式 一.概念 1.理解策略模式 策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现.策略模式最大的特点是行为的变化,行为之间可以相互替换. 每个if判断 ...
- 深入探索Java设计模式(二)之策略模式
策略设计模式是Java API库中常见的模式之一.这与另一个设计模式(称为状态设计模式)非常相似.本文是在学习完优锐课JAVA架构VIP课程—[框架源码专题]中<学习源码中的优秀设计模式> ...
- Java设计模式(学习整理)---策略模式
1. 模式定义 把会变化的内容取出并封装起来,以便以后可以轻易地改动或扩充部分,而不影响不需要变化的其他部分: 2.模式本质: 少用继承,多用组合,简单地说就是:固定不变的信息 ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- 设计模式之第8章-策略模式(Java实现)
设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲10 ...
- 大型Java进阶专题(七) 设计模式之委派模式与策略模式
前言 今天开始我们专题的第七课了.本章节将介绍:你写的代码中是否觉得很臃肿,程序中有大量的if...else,想优化代码,精简程序逻辑,提升代码的可读性,这章节将介绍如何通过委派模式.策略模式让你 ...
- Java设计模式(14)责任链模式(Chain of Responsibility模式)
Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...
- Android设计模式之命令模式、策略模式、模板方法模式
命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从 ...
- java设计模式解析(11) Chain责任链模式
设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...
随机推荐
- 表空间常用sql汇总
表空间碎片相关:select tablespace_name, round(sqrt(max(blocks) / sum(blocks)) * (100 / sqr ...
- January 21 2017 Week 3 Saturday
Courage is grace under pressure. 勇气就是压力下的优雅. In the face of stress, can you deal with your task smoo ...
- ZT sem_init sem_wait sem_post sem_destroy
sem_init() 2009-06-26 16:43:11| 分类: linux |字号 订阅 信号量的数据类型为结构sem_t,它本质上是一个长整型的数.函数sem_init()用来 ...
- SAP CRM One order里user status和system status的mapping逻辑
Below example show: How the mapping relationship between User status and System status maintained in ...
- Service Fabric eShop On Containers
Service Fabric承载eShop On Containers 从模块化到微服务化 从Pet Shop 到eShop on Container都是Microsoft在技术演进的路径上给开发者展 ...
- 使用log4j让日志写入数据库
之前做的一个项目有这么个要求,在日志管理系统里,需要将某些日志信息存储到数据库里,供用户.管理员查看分析.因此我就花了点时间搞了一下这一功能,各位请看. 摘要:我们知道log4j能提供强大的可配置的记 ...
- Codeforces Round #540 (Div. 3) C. Palindromic Matrix 【暴力】
任意门:http://codeforces.com/contest/1118/problem/C C. Palindromic Matrix time limit per test 2 seconds ...
- VS调试_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));崩溃原因及解决方法
今天下午对面的老大调试遇到这个问题,大家一起讨论好久才解决这个问题 crt源代码都是可以看到的,为了了解清楚原因,十分有必要查看源码,源码一般在你的VS安装路径下VC\crt\src下. 点击重试,定 ...
- HDU 1735 字数统计(模拟+一点点贪心的思想)
题目戳我 字数统计 Time Limit: 1000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 可能是catalan数吧
What's the number of distinct BSTs containing nodes {1, 2, 3 ,4}? 包含节点{1,2,3,4}的不同二叉搜索树有多少棵? int Num ...