设计模式之策略模式Strategy
/**
* 策略设计模式
* 策略模式:定义一系列的算法族,使他们之间可以相互转换,动态的改变其行为。
* 问题:设计一个鸭子模拟游戏。
* 现在有一群鸭子:
* ①这些鸭可以有飞的行为(分为快和慢),也可以没有飞的行为;
* ②对于鸭的叫声有沉默,也有响亮地叫,或者说也有小声地叫。那么按照我们平时的设计习惯,我们首先会定义一个父类(鸭),
* 然后我们将这两种行为排列组合将产生3*3=9个鸭子的子类,这是一件多么费体力的事情。如果说还有另外一些行为呢,那又要乘了,所以这种设计方式显然不好。
* 我们现在采用策略设计模式:将行为抽象定义成各个接口,然后将他们的具体行为封装成各个对象,使这些对象可以相互转换。
* User: HYY
* Date: 13-11-11
* Time: 下午11:31
* To change this template use File | Settings | File Templates.
*/
abstract class Duck {
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior; public void performFly() {
this.flyBehavior.fly();
} public void performQuack() {
this.quackBehavior.quack();
} //鸭子的外观
public abstract void display(); //以下两个setter用于动态的设置鸭的行为
void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
} void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
} //以下定义两个行为接口
interface FlyBehavior {
public void fly();
} interface QuackBehavior {
public void quack();
} //以下四个类定义具体的“飞”和“鸭叫”行为
class HighSpeedFlyBehavior implements FlyBehavior {
public void fly() {
System.out.println("我正在高速飞翔!");
}
} class SlowSpeedFlyBehavior implements FlyBehavior {
public void fly() {
System.out.println("我正在缓慢飞翔!");
}
} class SilenceQuackBehavior implements QuackBehavior {
public void quack() {
System.out.println("- - - - - 沉默地叫 - - - - ");
}
} class LoudQuackBehavior implements QuackBehavior {
public void quack() {
System.out.println("我正在大声地叫喊!");
}
} //下面两个类继承Duck类,是具体的鸭种类 /**
* 这个是绿头鸭子类(假设飞的慢而没有叫声)
*/
class MallardDuck extends Duck {
public MallardDuck() {
super();
this.flyBehavior = new SlowSpeedFlyBehavior();
this.quackBehavior = new SilenceQuackBehavior();
} @Override
public void display() {
System.out.println("我是绿头鸭子!");
}
} /**
* 这个是红头鸭子(假设飞的快而且叫声响亮)
*/
class RedheadDuck extends Duck { public RedheadDuck() {
super();
this.flyBehavior = new HighSpeedFlyBehavior();
this.quackBehavior = new LoudQuackBehavior();
} @Override
public void display() {
System.out.println("我是红头鸭子!");
}
}
public class Main {
public static void main(String[] args) {
Duck redheadDuck = new RedheadDuck();
redheadDuck.display();
redheadDuck.performFly();
redheadDuck.performQuack();
//动态改变红头鸭子的飞和叫行为
System.out.println("———————————————————————————————————");
redheadDuck.setFlyBehavior(new SlowSpeedFlyBehavior());
redheadDuck.setQuackBehavior(new SilenceQuackBehavior());
redheadDuck.performFly();
redheadDuck.performQuack();
}
}
设计模式之策略模式Strategy的更多相关文章
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- JAVA设计模式之策略模式 - Strategy
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式… Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...
- [设计模式] 21 策略模式 Strategy
在GOF的<设计模式:可复用面向对象软件的基础>一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.该模式使得算法可独立于使用它的客户而变化. 策略模 ...
- 大熊君说说JS与设计模式之------策略模式Strategy
一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并 ...
- 大话设计模式之策略模式(strategy)
策略模式:它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响使用算法的用户. 针对商城收银模式,打折,返现促销等的例子: 打折还是促销其实都是一些算法,可以用工厂模式来 ...
- 设计模式 笔记 策略模式 Strategy
//---------------------------15/04/28---------------------------- //Strategy 策略模式----对象行为型模式 /* 1:意图 ...
随机推荐
- 5.CentOS6.6安装git
额,因为公司的项目存放在gitlab上,所以要求员工必须会使用git 这里简单说下git在 linux下的安装,使用的说明,我会单开一篇文章来写 1.首先卸载掉CentOS6.6自带的1.7.1版本的 ...
- 安卓SQLite数据库操作,半小时开发新闻管理系统,纯干货
本教程致力于可以快速的学习安卓软件开发,希望能通过一系列自己手写的教程,帮助正在学习或想要学习安卓开发的同仁. 本教程由今日头条-全栈攻城狮号首发,都是一个字一个字码的.请尊重劳动成果,转载请注明出处 ...
- yii中的自定义组件
yii中的自定义组件(组件就是一些自定义的公用类) 1.在项目目录中的protected/components/Xxxx.php 2.在Xxxx.php中定义一个类,类名必须与文件名相同 3.控制器中 ...
- php之数据类型自动转换
1:概述 ---php是一种弱类型的语言,它可以根据运行环境的变化而自动进行数据类型的转换 1.1转换成布尔类型的原则 以下值都将转换成布尔类型中的false: A.布尔类型的false; B.空字符 ...
- python中关于正则表达式一
ab+,描述一个'a'和任意个'b',那么'ab','abb','abbbbb' 正则表达式可以:1.验证字符串是否符合指定特征,比如验证是否是合法的邮件地址 2.用来查找字符串,从一个长的文本中查找 ...
- Java中的static关键字解析(转自海子)__为什么main方法必须是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...
- 迭代map方法
Map<String, String> map=new HashMap<String,String>();map.put("1", "one&qu ...
- redis基本数据类型【2】-Hash类型
一.概述 1.散列是一种典型的字典结构,filed和value的映射,但value只能存储字符串,不支持其他类型 2.一个散列类型最多包含 2^32 -1个字段 3.散列适合存储对象:使用对象和ID构 ...
- 数学符号π (Pi)、Σ(Capital Sigma)、μ (Mu) 、σ(sigma)、∏(capital pi), ∫(Integral Symbol)的来历
1.π (Pi; periphery/周长) March 14 marks Pi Day, the holiday commemorating the mathematical constant π ...
- 远程mysql出现ERROR 1130 (HY000): Host '172.17.42.1' is not allowed to connect to this MySQL server
ERROR 1130: Host ***.***.***.*** is not allowed to connect to this MySQL server 说明所连接的用户帐号没有远程连接的权限, ...