(4条消息) 实验一:行为型设计模式之Strategy模式_学习微站的博客-CSDN博客

80 阅读4分钟

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

blog.csdn.net/weixin_4320…

一、实验目的

熟练使用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 整合鸭子的行为

运行结果如下
在这里插入图片描述
blog.csdn.net/weixin_4320…

四、实验结果分析

1 策略模式的设计意图

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

2 策略模式的结构

3 策略模式的优点

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

4 策略模式的缺点

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

欢迎您关注我的微信公众号:学习微站(studysth)
在这里插入图片描述

本文使用 文章同步助手 同步