前言

如果说,商场打折针对不同的时节,比如双十一、圣诞节、春节这些值得促销的好日子,进行不同程度的降价打折从而获得最大程度上的收益,如果有一群鸭子,只会游泳、嘎嘎叫,但是某一天某种类型的鸭子学会了飞,那群里面的鸭子并不会飞。这样的话还有修改以前的封装好的算法,然后添加飞翔的功能,这个时候,就得考虑一下设计原则。对扩展开放,对修改封闭。针对这种算法经常变化的情况,将这些算法封装起来,独立于不变的成分,保证增加新的算法的同时,对不变的地方不添加修改。下面采用 Strategy
Pattern 进行实现。分别从UML图分析和代码两个方面进行分析。

内容

精华:

定义了算法族,分别封装起来,让它们之间相互替换,此模式让算法的变化独立于使用算法的客户。

原则:

·将变化的地方封装起来了(封装变化)。

·多用组合,少用继承。

·针对接口编程,不针对实现。

UML图

DEMO部分:

说明:以下的代码为左半部分抽象类与子类继承抽象类,从而子类继承抽象类的属性和行为,其中的setFlyBehavior和setQuackBehavior方法作用可以在客户端调用该对象的时候动态添加鸭子的行为。

<span style="font-family:KaiTi_GB2312;font-size:18px;">package Duck;

/*
* author:zhoulitong
*/
abstract class Duck{
FlyBehavior flyBehavior;
QuackBehavior quackBehavior; //表演一个叫的动作
public void performQuack(){
quackBehavior.quack();
} //表演一个飞的动作
public void performFly(){
flyBehavior.fly();
} public abstract void display(); //有了这个方法可以动态改变鸭子的行为了
public void setFlyBehavior(FlyBehavior fb){
flyBehavior = fb;
} public void setQuackBehavior(QuackBehavior qb){
quackBehavior = qb;
}
} class MallardDuck extends Duck{
public MallardDuck(){
quackBehavior = new Quack();//实例化叫的实例
flyBehavior = new FlyWithWings();//实例化飞的实例
} public void display(){
System.out.println("小鸭是一个真正的鸭子!不是白天鹅");
}
}</span>

说明:接口部分,这部分的代码是封装了变化的部分,从而让变化的部分独立于不变的部分,让这个设计模式更加的符合开闭原则,在这里,接口部分盛放的是鸭子的功能,鸭子表现行为的时候,分别利用多态进行按需求实例化自己想要的那部分功能行为。

<span style="font-family:KaiTi_GB2312;font-size:18px;">/*
* author:zhoulitong
*/
//声明一个公共接口(类似于抽象类的功能)
interface QuackBehavior {
void quack();//声明一个呱呱叫的方法
} class Quack implements QuackBehavior{
public void quack(){
//实现鸭子呱呱叫
}
} class Squeak implements QuackBehavior{
public void quack(){
//实现橡皮鸭吱吱叫的方法
}
} class MuteQuack implements QuackBehavior{
public void quack(){
//什么都不做,不会叫
}
} interface FlyBehavior{
void fly();//声明一个飞的接口方法
} class FlyWithWings implements FlyBehavior{
public void fly(){
//实现鸭子的飞行动作
}
} class FlyNoWay implements FlyBehavior{
public void fly(){
//什么都不做,不会飞
}
} class FlyRocketPowered implements FlyBehavior{
public void fly(){ }
}</span>

说明:客户端代码部分,申请一个对象的实例,采用了多态机制,实例化了一个实际存在的鸭子对象,分别执行行为。

<span style="font-family:KaiTi_GB2312;font-size:18px;">public class MiniDuckSimulator{
public static void main (String[] args){
Duck mallard = new MallardDuck();//实例化一个鸭子
mallard.performFly();//飞的动作
mallard.performQuack();//叫的动作 //如果又增加了一个动作,可以通过Duck父类中的set方法对实例化的对象进行附加
//在运行时想要改变鸭子的行为,只需要调用鸭子的setter方法就可以了。
mallard.setFlyBehavior(new FlyRocketPowered());
mallard.performFly();
}
}</span>

小结

上面就是策略模式一个小小的应用,希望在后期有更多实践。

感谢您的宝贵时间···

【Java】Strategy Pattern的更多相关文章

  1. 【Java】Observer Pattern

    前言 代码来源于生活,更加高于生活.设计模式让我们的生活更加的方便.观测一个东西,盯着一个东西,关注一个公众号,这些东西,如果没有即时通知的话,我们又特别想了解这方面的内容,那么我们除了一直耗着时间找 ...

  2. 【Java】-NO.20.Exam.1.Java.1.001- 【1z0-807】- OCEA

    1.0.0 Summary Tittle:[Java]-NO.20.Exam.1.Java.1.001-[1z0-807] Style:EBook Series:Java Since:2017-10- ...

  3. 【Java】-NO.16.EBook.4.Java.1.007-【疯狂Java讲义第3版 李刚】- Java基础类

    1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.007-[疯狂Java讲义第3版 李刚]-  Java基础类 Style:EBook Series:J ...

  4. 【Java】-NO.11.Java.1.Log4j.1.001-【Log4j Manual】-

    1.0.0 Summary Tittle:[Java]-NO.11.Java.1.Log4j.1.001-[Log4j2 Manual]- Style:Java Series:Log4j Since: ...

  5. 数据结构与算法【Java】03---栈

    前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...

  6. 【Java】代处理?代理模式 - 静态代理,动态代理

    >不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...

  7. 【Java】推断文件的后缀名

    这本来不是一个问题,利用框架本来有的方法.或者File类的getPath()方法,取出要推断文件路径.或者getName()方法取出文件路径,成为一个String字符串如果为fileName之后,再对 ...

  8. 【JAVA】【NIO】3、Java NIO Channel

    Java NIO和流量相似,但有些差异: ·通道可读写,流仅支持单向.读或写 ·异步通道读取 ·通道读写器,他们是和Buffer交替 道的实现 下面是Java NIO中最重要的通道的实现: ·File ...

  9. 【JAVA】【NIO】5、Java NIO Scatter / Gather

    标题手段Java NIO该分散体浓缩 Java NIO内置支持分散与收集.的概念主要用于信道分散聚集的读写. 读出的分散体的一个通道被读多个数据buffer在.因此.数据分散到多个buffer中. 对 ...

随机推荐

  1. Windows SID理解

    Windows安全性要依赖于几个基本元素.:访问令牌.SID.安全描述符.访问控制列表.密码. 访问令牌:访问令牌在本质上定义了两 上“P”:Permissions(权限)和Privilege(特权) ...

  2. mybatis如何防止sql注入(1)

    sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如“or ‘1’=‘1’”这样的语句,有可能入侵参数校验不足的应用程序.所以在我们的应用中需要 ...

  3. 火星坐标、百度坐标、WGS84坐标转换代码(JS)

    JS版本源码 /** * Created by Wandergis on 2015/7/8. * 提供了百度坐标(BD09).国测局坐标(火星坐标,GCJ02).和WGS84坐标系之间的转换 */ / ...

  4. 分布式爬虫搭建系列 之一------python安装及以及虚拟环境的配置及scrapy依赖库的安装

    python及scrapy框架依赖库的安装步骤: 第一步,python的安装 在Windows上安装Python 首先,根据你的Windows版本(64位还是32位)从Python的官方网站下载Pyt ...

  5. Java中Object.hashCode contract

    面试时在这个问题上犯了个错误,只重写了equals方法,而没有覆盖hashCode()方法. 回来重读了Effective Java的Item 9,里面提到Object.hashCode contra ...

  6. jquery ajax中error返回错误解决办法

    转自:https://www.jb51.net/article/72198.htm 进入百度搜索此问题,发现有人这么说了一句 Jquery中的Ajax的async默认是true(异步请求),如果想一个 ...

  7. DevTools in Spring Boot 1.3

    Spring Boot 1.3 will ship with a brand new module called spring-boot-devtools. The aim of this modul ...

  8. python之数据库的操作(课前准备)

    数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. 上面的就是数据库的定义. 何为数据库,简单的来说,就是我们的大型数据的存放地点. 而我们学习的呢就是数据库的访问层的制作. 何为 ...

  9. 修改 linux 时区时间和 php 时区

    问题:客户美国服务器时间不对第一步,先修改硬件时区. vim /etc/sysconfig/clock将 ZONE="America/New_York" 注释,加多一行 ZONE= ...

  10. Internet Intranet Extranet

    Internet: There's only one of it, and you're on it now. Intranet: An internal network local to a com ...