0
点赞
收藏
分享

微信扫一扫

实验一:行为型设计模式之Strategy模式


实验一:行为型设计模式之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("我不会飞行");
}
}

运行结果如下:

实验一:行为型设计模式之Strategy模式_java

设计思路二:采用接口

具体代码如下:
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模式_鸭子类型_02

设计思路三:采用策略模式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 整合鸭子的行为

运行结果如下

实验一:行为型设计模式之Strategy模式_鸭子类型_03


​​javascript:void(0)​​

四、实验结果分析

1 策略模式的设计意图

略模式是指有一定行动内容的相对稳定的策略名称。策略模式在古代中又称“计策”,简称“计”,如《汉书·高帝纪上》:“汉王从其计”。这里的“计”指的就是计谋、策略。策略模式具有相对稳定的形式,如“避实就虚”、“出奇制胜”等。一定的策略模式,既可应用于战略决策,也可应用于战术决策;既可实施于大系统的全局性行动,也可实施于大系统的局部性行动。

2 策略模式的结构

3 策略模式的优点

  1. 每个算法单独封装,减少了算法和算法调用者的耦合。
  2. 合理使用继承有助于提取出算法中的公共部分。
  3. 简化了单元测试。

4 策略模式的缺点

  1. 策略模式只适用于客户端知道所有的算法或行为的情况。
  2. 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。不过可以使用享元模式来减少对象的数量。

欢迎您关注我的微信公众号:学习微站(studysth)

实验一:行为型设计模式之Strategy模式_策略模式_04


举报

相关推荐

0 条评论