实验一:行为型设计模式之Strategy模式
一、实验目的
熟练使用JAVA实现行为型设计模式-策略模式,理解设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
二、实验内容
某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如图所示:
游戏名称S i m U D u c k
三、实验步骤
设计思路一:采用继承的方式
具体代码如下:
Duck.java
package ex;
public abstract class Duck {
public Duck(){
display();
quack();
fly();
}
public void quack() {
System.out.println("我能“嘎嘎”叫");
}
public void fly(){
System.out.println("我能飞");
}
public abstract void display();
}
Text.java
package ex;
public class Test {
public static void main(String[] args){
Duck mallar_duck=new MallardDuck();
Duck readhead_duck=new RedheadDuck();
Duck rubber_duck=new RubberDuck();
Duck cotton_duck=new CottonDuck();
}
}
MallardDuck.java
package ex;
public class MallardDuck extends Duck{
public void display() {
System.out.println("我是一只灰色羽毛的鸭子");
}
}
RedheadDuck.java
package ex;
public class RubberDuck extends Duck{
public void display() {
System.out.println("我是一只黑白的橡皮鸭");
}
public void quack() {
System.out.println("我不会呱呱叫,"+"但是我能发出橡皮与空气的摩擦声");
}
public void fly() {
}
}
RubberDuck.java
package ex;
public class RubberDuck extends Duck{
public void display() {
System.out.println("我是一只黑白的橡皮鸭");
}
public void quack() {
System.out.println("我不会呱呱叫,"+"但是我能发出橡皮与空气的摩擦声");
}
public void fly() {
}
}
CottonDuck.java
package ex;
public class CottonDuck extends Duck{
public void display() {
System.out.println("我是一只白色的棉花鸭子");
}
public void quack() {
System.out.println("我不会发声");
}
public void fly() {
System.out.println("我不会飞行");
}
}
运行结果如下:
设计思路二:采用接口
具体代码如下:
CottonDuck.java
package interf;
public class CottonDuck extends Duck implements Flyable,Quackable{
public void display()
{
System.out.println("我是棉花鸭,我有白色羽毛");
}
public void fly()
{
System.out.println("我不会飞");
}
public void Quack()
{
System.out.println("不能发出声音。。。");
}
public void GetHavior ()
{
this.display();
this.fly();
this.Quack();
}
}
Duck.java
package interf;
public class Duck {
public void display(){}
}
Flyable.java
package interf;
public interface Flyable {
abstract void fly();
}
MallardDuck.java
package interf;
public class MallardDuck extends Duck implements Flyable,Quackable {
public void display()
{
System.out.println("我是一只小灰鸭,我有灰色羽毛");
}
public void fly()
{
System.out.println("我会飞");
}
public void Quack()
{
System.out.println("我会嘎嘎叫。。。");
}
public void GetHavior ()
{
this.display();
this.fly();
this.Quack();
}
}
5 Quackable.java
package interf;
public interface Quackable {
abstract void Quack();
}
6 RedHeadDuck.java
package interf;
public class RedHeadDuck extends Duck implements Flyable,Quackable {
public void display()
{
System.out.println("我是一只小红鸭,我有灰色羽毛,红色头部");
}
public void fly()
{
System.out.println("我会飞");
}
public void Quack()
{
System.out.println("我会嘎嘎叫。。。");
}
public void GetHavior ()
{
this.display();
this.fly();
this.Quack();
}
}
7 RubberDuck.java
package interf;
public class RubberDuck extends Duck implements Flyable,Quackable {
public void display()
{
System.out.println("我是橡皮鸭,我有黑白橡皮羽毛");
}
public void fly()
{
System.out.println("我不会飞");
}
public void Quack()
{
System.out.println("我会发出橡皮与空气摩擦的声音");
}
public void GetHavior()
{
this.display();
this.fly();
this.Quack();
}
}
8 test.java\
package interf;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
RedHeadDuck a=new RedHeadDuck();
a.GetHavior();
MallardDuck b=new MallardDuck();
b.GetHavior();
CottonDuck c=new CottonDuck();
c.GetHavior();
RubberDuck d=new RubberDuck();
d.GetHavior();
}
}
运行结果如下:
设计思路三:采用策略模式strategy
1 实现鸭子的行为
代码如下:
Duck类:
public abstract class duck {
FlyBehavior flybehavior;
QuackBehavior quackbehavior;
abstract void display();
void GetName(FlyBehavior flybehavior,QuackBehavior quackbehavior)
{
this.flybehavior=flybehavior;
this.quackbehavior=quackbehavior;
}
void GetBeHavior()
{
flybehavior.fly();
quackbehavior.Quack();
}
}
红头鸭类:
public class RedHeadDuck extends duck {
public void display()
{
System.out.println("我是一只小红鸭,我有灰色羽毛,红色头部");
}
}
小灰鸭类:
public class MallardDuck extends duck {
public void display()
{
System.out.println("我是一只小灰鸭,我有灰色羽毛");
}
}
棉花鸭类:
public class cottonDuck extends duck {
public void display()
{
System.out.println("我是棉花鸭,我有白色羽毛");
}
}
橡皮鸭类:
public class RubberDuck extends duck{
public void display()
{
System.out.println("我是橡皮鸭,我有黑白橡皮羽毛");
}
}
飞行能力接口以及实现接口方法类:
public interface FlyBehavior {
abstract void fly();
}
class HaveFly implements FlyBehavior{
public void fly()
{
System.out.println("我会飞");
}
}
class NoFly implements FlyBehavior{
public void fly()
{
System.out.println("我不会飞");
}
}
叫声接口以及实现接口方法类:
public interface QuackBehavior {
abstract void Quack();
}
class GuaQuack implements QuackBehavior{
public void Quack()
{
System.out.println("不能发出声音。。。");
}
}
class ZiQuack implements QuackBehavior{
public void Quack()
{
System.out.println("我会嘎嘎叫。。。");
}
}
class xiQuack implements QuackBehavior{
public void Quack()
{
System.out.println("我会发出橡皮与空气摩擦的声音");
}
}
测试类:
public class Client {
public static void main(String[] args) {
// TODO 自动生成的方法存根
RedHeadDuck a=new RedHeadDuck();
a.display();
a.GetName(new HaveFly(), new ZiQuack());
a.GetBeHavior();
MallardDuck b=new MallardDuck();
b.display();
b.GetName(new HaveFly(), new ZiQuack());
b.GetBeHavior();
cottonDuck c=new cottonDuck();
c.display();
c.GetName(new NoFly(), new GuaQuack());
c.GetBeHavior();
RubberDuck d=new RubberDuck();
d.display();
d.GetName(new NoFly(), new xiQuack());
d.GetBeHavior();
}
}
2 整合鸭子的行为
运行结果如下
javascript:void(0)
四、实验结果分析
1 策略模式的设计意图
略模式是指有一定行动内容的相对稳定的策略名称。策略模式在古代中又称“计策”,简称“计”,如《汉书·高帝纪上》:“汉王从其计”。这里的“计”指的就是计谋、策略。策略模式具有相对稳定的形式,如“避实就虚”、“出奇制胜”等。一定的策略模式,既可应用于战略决策,也可应用于战术决策;既可实施于大系统的全局性行动,也可实施于大系统的局部性行动。
2 策略模式的结构
3 策略模式的优点
- 每个算法单独封装,减少了算法和算法调用者的耦合。
- 合理使用继承有助于提取出算法中的公共部分。
- 简化了单元测试。
4 策略模式的缺点
- 策略模式只适用于客户端知道所有的算法或行为的情况。
- 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。不过可以使用享元模式来减少对象的数量。
欢迎您关注我的微信公众号:学习微站(studysth)