今年寒假没有回家,打算利用这个假期的时间进行学习设计模式,这一个人感觉比较牛的知识,前一段时间一直在忙着搞自己的专业课,还有就是捣鼓了一下Linux系统,没有好好的学习关于Java还有Android方面的知识。我想学习设计模式的原因是在于大二暑假的时候自己做了一自己的APP,有点商业化的软件。在做这个APP的过程中,我发现了很多的问题,比如自己在实现功能的时候会为了一个共同的功能需要写很多的重复的代码,这也让我很苦恼,当然当时也接触了一些的设计模式比如单例模式之类的。所以这就滋生了我学习设计模式的想法。好啦,废话不多说了,开始将策略模式的实现吧。
**什么是策略模式**
策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
**策略模式的三个角色**
(1)环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2)抽象策略对象:它可由接口或抽象类来实现。
(3)具体策略对象:它封装了实现同不功能的不同算法。
**设计原则:(1)针对接口编程,而不是针对实现编程。
(2)多用组合,少用继承。
(3)封装变化。**
**设计基础:(1)抽象
(2)封装
(3)继承
(4)多态**

应用实例:

设计鸭子的行为不同的鸭子需要有不同的行为,比如有的鸭子可以飞,有的则不可以,有的鸭子可以大声鸣叫,有的则是小声鸣叫。但是。所有的鸭子都可以游泳,应为这时他们的天性。

实现的代码如下:

首先是根据针对接口编程,不针对实现编程的原则,先建立两个接口:FlyBehavior接口和QuackBehavior接口。

QuackBehavior接口:

package com.example.duck;

public interface QuackBehavior {
public void quack();
}

FlyBehavior接口:

package com.example.duck;

public interface FlyBehavior {
public void fly();
}

建立一个公共类Duck,因为鸭子有很多的共性

package com.example.duck;

/**
*
* @author bingbingliang
*含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写
*抽象类不能被实例化
*你会发现在下面的例子中会有这样的实例化的调用
*/
public abstract class Duck {
FlyBehavior flybehavior;
QuackBehavior quackbehavior;
public Duck(){}
//创建抽象方法,抽象类中的抽象方法必须被实现,但是抽象类中的普通方法可以不必被实现
public abstract void display();
public void performFly(){
flybehavior.fly();
}
public void performquack(){
quackbehavior.quack();
}
public void swim(){
System.out.println("All Duck float,even decoys");
} }

公共类需要继承来实现那些不同的功能。

MallarDuck类

package com.example.duck;

public class MallarDuck extends Duck{
public MallarDuck(){
//改得时候只需要该这个地方就可以了
flybehavior = new FlyWithWings();
quackbehavior = new Quack();
}
public void display(){
System.out.println("I'm a real MallarDuck");
}
}

鸭子的不同的功能中使用FlyBehavior接口实现

FlyNoWay类(不会飞的鸭子)

package com.example.duck;

public class FlyNoWay implements FlyBehavior{
public void fly(){
System.out.println("I can't flys");
}
}

FlyWithWings类(会飞的鸭子)

package com.example.duck;

public class FlyWithWings implements FlyBehavior{
public void fly(){
System.out.println("I can fly with my wings");
}
}

Quack类(小声叫的鸭子)

package com.example.duck;

public class Quack implements QuackBehavior{
public void quack(){
System.out.println("Quack");
}
}

Squack类(大声叫的鸭子)

package com.example.duck;

public class Squack implements QuackBehavior{
public void quack(){
System.out.println("Squack");
}
}

主函数MiniDuckSimulator类

package com.example.duck;

public class MiniDuckSimulator {

    public static void main(String[] args) {
// TODO Auto-generated method stub
Duck mallard = new MallarDuck();
mallard.performFly();
mallard.performquack();
} }

好啦。上面的功能到这里就实现出来了,实现的结果如下:

I can fly with my wings

Quack

这个实例也实现了多用组合,少用继承的原则。

策略模式的优点

  (1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。

  (2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

策略模式的缺点

  (1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。

  (2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

Java设计模式之策略模式(一)的更多相关文章

  1. Java设计模式1——策略模式(Strategy Pattern)

    最近觅得一本好书<您的设计模式>,读完两章后就能断言,一定是一头极品屌丝写的,而且是专写给开发屌丝男的智慧枕边书,小女子就委屈一下,勉强看看,人笨,谁让他写得这么通俗易懂呢!为了加深理解, ...

  2. JAVA设计模式 之 策略模式

    一. 定义 设计模式定义了算法族,分别封装起来,让他们之间可以互相替代,此模式让算法的变化独立于使用算法的客户(该定义来自于Head First 设计模式). 二. 应用场景 当我们在应用程序中完成一 ...

  3. Java设计模式---Strategy策略模式

    参考于 : 大话设计模式 马士兵设计模式视频 1.场景介绍 购物网站上有一个产品,有三个字段,档次,价格,重量. 有些同学喜欢轻的,有些手头紧,想要便宜的,有些喜欢档次高的. 那么我们为了提高网站用户 ...

  4. 折腾Java设计模式之策略模式

    博客原文地址 简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.简单理解就是一组算法,可以互换,再简单点策略就是封装算法. ...

  5. Java 设计模式之 策略模式

    思维导图: 我们先来看 STRATEGY 设计模式的通俗解释: 跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到 MM 的芳心, ...

  6. java设计模式之策略模式

    策略模式 定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户(大话设计模式). 策略模式UML图   策略模式代码 古代的各种计谋都是一种策略,这次我们 ...

  7. Java设计模式之-----策略模式

    首先,我们来看下策略模式的概念.一般的解释如下:     策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The St ...

  8. java设计模式之——策略模式

    1.策略模式有什么好处? 策略模式的好处在于你可以动态的改变对象的行为. 2.设计原则 设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类),然后在类中包含这 ...

  9. 小白学习java设计模式之策略模式

    策略模式:1.分析项目中的变化部分与不变部分(每个设计模式都要分析的)2.多用组合少用继承;用行为类组合,而不是行为继承,更具有弹性直接上代码: package com.wz.oneStrategis ...

随机推荐

  1. mkimage工具 加载地址和入口地址 内核启动分析

    第三章第二节 mkimage工具制作Linux内核的压缩镜像文件,需要使用到mkimage工具.mkimage这个工具位于u-boot-2013. 04中的tools目录下,它可以用来制作不压缩或者压 ...

  2. HDU 5335 Walk Out

    题意:在一个只有0和1的矩阵里,从左上角走到右下角, 每次可以向四个方向走,每个路径都是一个二进制数,求所有路径中最小的二进制数. 解法:先bfs求从起点能走到离终点最近的0,那么从这个点起只向下或向 ...

  3. 《深入Java虚拟机学习笔记》- 第12章 整数运算

    Java虚拟机提供几种进行整数算术运算的操作码,他们执行基于int和long类型的运算.当byte.short和char类型值参与算术运算时,首先会将它们转换为int类型.这些操作码都不会抛出异常,溢 ...

  4. 【opencv】图像细化

    [原文:http://blog.csdn.net/qianchenglenger/article/details/19332011] 在我们进行图像处理的时候,有可能需要对图像进行细化,提取出图像的骨 ...

  5. HTTP协议 概述

    本文主要说明一些 Http 相关的基本概念和基本知识,主要针对像我一样的初学者,知识主要来自于<Http 权威指南> 除了分享这些基本知识之外,笔者也是为将来找工作复习之用.(协议就是协议 ...

  6. codeforce 604B More Cowbell

    题意:n个球,分成k堆.问堆的最大值的最小. #include <bits/stdc++.h> typedef long long ll; using namespace std; int ...

  7. Adobe CS6系列PJ方法

    PJ中国人都懂得... 今天舍友问我photoshop cs6的PJ方法,我想这个问题大家都会遇到把,我这就小介绍下啦,很简单的... 我这里用PSCS6来介绍,其它软件都是一样的.而且PJ文件都是一 ...

  8. 编译并使用Lua语言

    Lua是一个小巧的脚本语言,该语言设计的目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. 可扩展性.Lua的扩展性非常卓越,可以通过Lua代码或C代码扩展,很多功能可以通过外部库来扩 ...

  9. Redis的探究

    之前大四时候实习的公司有使用过Redis,不过那时所有配置均由主管完成了,而我也只是处于能使用的阶段. 时隔1年多,近期回想起这货,在研究中,想把它整合进现在公司的网站系统中,做做数据快照(已完成)和 ...

  10. 二叉搜索树算法详解与Java实现

    二叉查找树可以递归地定义如下,二叉查找树或者是空二叉树,或者是满足下列性质的二叉树: (1)若它的左子树不为空,则其左子树上任意结点的关键字的值都小于根结点关键字的值. (2)若它的右子树不为空,则其 ...