文章目录

  • 实验目的
  • 实验内容
    • 一:能播放各种声音的软件产品
      • 1.Application.java
      • 2.Dog.java
      • 3.Simulator.java
      • 4.Sound.java
      • 5.Violin.java
    • 二:简单工厂模式-女娲造人
      • 1.BlackHuman.java
      • 2.Human.java
      • 3.HumanFactory.java
      • 4.NvWa.java
      • 5.WhiteHuman.java
      • 6.YellowHuman.java
    • 三:工厂方法模式--女娲造人
      • 7.BlackHumanF.java
      • 8.WhiteHumanF.java
      • 9.YellowHumanF.java
    • 四:适配器模式--交流电转直流电
      • 1.AlternateCurrent.java
      • 2.DirectCurrent.java
      • 3.ElectricAdapter.java
      • 4.PowerCompany.java
      • 5.Application.java
    • 五:策略模式--评分方案
      • 1.Application.java
      • 2.AverageScore.java
      • 3.Strategy.java
      • 4.StrategyA.java
      • 5.StrategyB.java
    • 六:状态模式--自动售货机
      • 1.Application.java
      • 2.AutoCoffeeMachine.java
      • 3.HaveCoffeeAndCoin.java
      • 4.HaveCoffeeNoCoin.java
      • 5.HaveNotCoffee.java
      • 6.State.java
    • 七:模拟游戏
      • 1.CottonDuck.java
      • 2.Duck.java
      • 3.FlyBehavior.java
      • 4.FlyNoWay.java
      • 5.FlyWithWings.java
      • 6.MallardDuck.java
      • 7.Quack.java
      • 8.QuackBehavior.java
      • 9.QuackNoWay.java
      • 10.RedHeadDuck.java
      • 11.RubherDuck.java
      • 12.Squeak.java

实验目的

(1) 理解设计模式的基本概念;
(2) 理解设计模式遵循的原则;
(3) 掌握经典设计模式及应用。

实验内容

一:能播放各种声音的软件产品

能播放各种声音的软件产品(理解开-闭原则(Open-Closed Principle,OCP–对扩展开放-而对修改关闭)。写java文件、编译java文件、执行class文件。

1.Application.java

public class Application{public static void main(String[] args) {Simulator simulator = new Simulator();simulator.setSound(new Dog());simulator.play();simulator.setSound(new Violin());simulator.play();}
}

2.Dog.java

public class Dog implements Sound {public void playSound() {System.out.println("汪汪...汪汪");}
}

3.Simulator.java

public class Simulator{Sound sound;public void setSound(Sound sound) {this.sound=sound;}public void play() {if(sound!=null) {sound.playSound();} else {System.out.println("没有可播放的声音");}}
}

4.Sound.java

public interface Sound{public abstract void playSound();
}

5.Violin.java

public class Violin implements Sound {public void playSound() {System.out.println("小提琴.梁祝");}
}

二:简单工厂模式-女娲造人

简单工厂模式–女娲造人。写java文件、编译java文件、执行class文件。
女娲架起了八卦炉(技术术语:建立工厂),开始造人。
过程如下:先捏泥巴成人形,再放入八卦炉里烤,最后扔到地上成长。时间烤短了,造出了“白种人”;时间烤长了,造出了“黑种人”;时间烤得不长不短,造出了“黄种人”。

1.BlackHuman.java

public class BlackHuman implements Human {public void talk() {System.out.println("黑人");}
}

2.Human.java

public interface Human{public void talk();
}

3.HumanFactory.java

public class HumanFactory{public static Human createHuman(String s) {Human human=null;if(s.equals(new String("whiteHuman")))human=new WhiteHuman();if(s.equals(new String("yellowHuman")))human=new YellowHuman();return human;}
}

4.NvWa.java

public class NvWa{public static void main(String [] args) {Human human=HumanFactory.createHuman("yellowHuman");human.talk();}
}

5.WhiteHuman.java

public class WhiteHuman implements Human {public void talk() {System.out.println("Hello!");}
}

6.YellowHuman.java

public class YellowHuman implements Human {public void talk() {System.out.println("您好!");}
}

三:工厂方法模式–女娲造人

工厂方法模式–女娲造人。写java文件、编译java文件、执行class文件。

7.BlackHumanF.java

public class BlackHumanF implements HumanFactory {public Human createHuman() {return new BlackHuman();}
}

8.WhiteHumanF.java

public class WhiteHumanF implements HumanFactory {public Human createHuman() {return new WhiteHuman();}
}

9.YellowHumanF.java

public class YellowHumanF implements HumanFactory {public Human createHuman() {return new YellowHuman();}
}

四:适配器模式–交流电转直流电

适配器模式–交流电转直流电。写java文件、编译java文件、执行class文件。
用户家里现有一台洗衣机,洗衣机使用交流电,现在用户新买了一台录音机,录音机只能使用直流电。由于供电系统供给用户家里的是交流电,因此用户需要用适配器将交流电转化直流电供录音机使用。

1.AlternateCurrent.java

public interface AlternateCurrent{public String giveAlternateCurrent();
}

2.DirectCurrent.java

public interface DirectCurrent{public String giveDirectCurrent();
}

3.ElectricAdapter.java

public class ElectricAdapter implements DirectCurrent {AlternateCurrent out;ElectricAdapter(AlternateCurrent out) {this.out=out;}public String giveDirectCurrent() {String m=out.giveAlternateCurrent();  //先由out得到交流电StringBuffer str=new StringBuffer(m);for (int i=0; i<str.length(); i++)    //将交流电转为直流电if(str.charAt(i)=='0') str.setCharAt(i,'1');m=new String(str);return m;  //返回直流电}
}

4.PowerCompany.java

public class PowerCompany implements AlternateCurrent {public String giveAlternateCurrent() {return "10101010101010101010";}
}

5.Application.java

public class Application {public static void main(String[] args) {AlternateCurrent aElectric = new PowerCompany();  //交流电aElectricWash wash=new Wash();wash.turnOn(aElectric);   //洗衣机使用交流电aElectricDirectCurrent dElectric=new ElectricAdapter(aElectric);  //将交流电适配成直流电Recorder recorder=new Recorder();recorder.turnOn(dElectric);  //录音机使用直流电dElectric}
}
class Wash {String name;Wash() { name = "洗衣机"; }public void turnOn(AlternateCurrent a) {String s = a.giveAlternateCurrent();System.out.println(name+"使用交流电:\n"+s);System.out.println("开始洗衣物。");}
}
class Recorder {   //录音机使用直流电String name;Recorder() { name = "录音机"; }public void turnOn(DirectCurrent a) {String s=a.giveDirectCurrent();System.out.println(name+"使用直流电:\n"+s);System.out.println("开始录音。");}
}

五:策略模式–评分方案

策略模式–评分方案。写java文件、编译java文件、执行class文件。
在多个裁判负责打分的比赛中,每位裁判给选手一个得分,选手的最后得分是根据全体裁判的得分计算出来的。请给出几种计算选手得分的评分方案(策略),对于某次比赛,可以从你的方案中选择一种方案作为本次比赛的评分方案。

1.Application.java

public class Application{public static void main(String[] args) {AverageScore game=new AverageScore();game.setStrategy(new StrategyA());double []a={9.12,9.25,8.87,9.99,6.99,7.88};double aver=game.getAverage(a);System.out.println(aver);}
}

2.AverageScore.java

public class AverageScore{Strategy strategy;public void setStrategy(Strategy strategy) {this.strategy=strategy;}public double getAverage(double []a) {return strategy.computerAverage(a);}
}

3.Strategy.java

public interface Strategy{public double computerAverage(double []a);
}

4.StrategyA.java

public class StrategyA implements Strategy {public double computerAverage(double []a) {double score=0,sum=0;for(int i=0;i<a.length;i++) {sum=sum+a[i];}score=sum/a.length;return score;}
}

5.StrategyB.java

import java.util.Arrays;public class StrategyB implements Strategy {public double computerAverage(double []a) {if(a.length<=2)return 0;double score=0,sum=0;Arrays.sort(a);  //排序数组for (int i=1; i<a.length-1; i++) {sum=sum+a[i];}score=sum/(a.length-2);return score;}
}

六:状态模式–自动售货机

状态模式–自动售货机。写java文件、编译java文件、执行class文件。
咖啡自动售货机共有3种状态,分别是“有咖啡,无人投币”、“有咖啡,有人投币”和“无咖啡”。咖啡自动售货机有两个方法:needAnCoin( )和sellCoffee( )。
咖啡自动售货机的默认初始状态是“有咖啡,无人投币”。当咖啡自动售货机处于“有咖啡,无人投币”状态时,调用sellCoffee( )方法将显示“需投一元硬币,才可以得到一杯咖啡”,并保持当前的状态;调用needAnCoin( )方法将显示“咖啡机里被投入了一元硬币”,然后咖啡自动售货机将处于“有咖啡,有人投币”状态,此时,如果调用sellCoffee( )方法将显示“送出一杯咖啡”,然后咖啡自动售货机将处于“有咖啡,无人投币”状态或“无咖啡”状态;当咖啡白动售货机处于“无咖啡”状态时,调用giveAnCupCoffee( )方法将显示“没有咖啡了,请拨111111服务电话”,调用needAnCoin( )方法将显示“投币无效,退回!”
请使用状态模式模拟咖啡自动售货机。

1.Application.java

public class Application{public static void main(String args[ ]){AutoCoffeeMachine machine = new AutoCoffeeMachine( );machine.sellCoffee( );      machine.needAnCoin( );machine.sellCoffee( );      machine.needAnCoin( );machine.sellCoffee( );      machine.needAnCoin( );machine.sellCoffee( );      machine.needAnCoin( );machine.sellCoffee( );}
}

2.AutoCoffeeMachine.java

public class AutoCoffeeMachine {State haveCoffeeNoCoin,haveCoffeeAndCoin,haveNotCoffee;State state;AutoCoffeeMachine( ){haveCoffeeNoCoin=new HaveCoffeeNoCoin(this);haveCoffeeAndCoin=new HaveCoffeeAndCoin(this);haveNotCoffee=new HaveNotCoffee(this);haveCoffeeNoCoin.coffeeCount=3;state=haveCoffeeNoCoin;  //设置售货机初始状态}public void sellCoffee( ){ state.giveAnCupCoffee( ); }public void needAnCoin( ){ state.comeInCoin( ); }public void setState(State state){ this.state=state; }
}

3.HaveCoffeeAndCoin.java

public class HaveCoffeeAndCoin extends State{AutoCoffeeMachine machine;HaveCoffeeAndCoin(AutoCoffeeMachine machine){this.machine=machine;   }public void giveAnCupCoffee( ){int n=machine.haveCoffeeNoCoin.coffeeCount;if(n>1) {  n--;System.out.println("送出一杯咖啡");machine.haveCoffeeNoCoin.coffeeCount = n;machine.setState(machine.haveCoffeeNoCoin);}  else if(n==1) {  n--;System.out.println("送出一杯咖啡");machine.setState(machine.haveNotCoffee);  }}public void comeInCoin( ){System.out.println("目前不允许投币");}
}

4.HaveCoffeeNoCoin.java

public class HaveCoffeeNoCoin extends State{AutoCoffeeMachine machine;HaveCoffeeNoCoin(AutoCoffeeMachine machine){this.machine=machine;}public void giveAnCupCoffee(){System.out.println("需投入一元,才可得一杯");}public void comeInCoin(){System.out.println("投入了一元硬币");machine.setState(machine.haveCoffeeAndCoin); }
}

5.HaveNotCoffee.java

public class  HaveNotCoffee extends State{AutoCoffeeMachine machine;HaveNotCoffee(AutoCoffeeMachine machine){this.machine=machine;}public void giveAnCupCoffee( ){System.out.println("没咖啡了,请拨111111");}public void comeInCoin( ){System.out.println("投币无效,退回!");}
}

6.State.java

public abstract class State{int coffeeCount;  //记录一共有多少杯咖啡public abstract void giveAnCupCoffee();public abstract void comeInCoin();
}

体会:策略模式与状态模式极其相似,但是二者有其内在的差别,策略模式将具体策略类暴露出去,调用者需要具体明白每个策略的不同之处以便正确使用。而状态模式状态的改变是由其内部条件来改变的,与外界无关,二者在思想上有本质区别。

七:模拟游戏

某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如下表所示。

为了支持将来能够模拟更多种类鸭子的特征,决定采用策略(Strategy)模式。试画出对应的设计模式的类图结构图。并写java文件、编译java文件、执行class文件。

1.CottonDuck.java

public class CottonDuck extends Duck{CottonDuck() {super();super.setAppearance("白色");super.setQuackBehavior(new QuackNoWay());super.setFlyBehavior(new FlyNoWay());}
}

2.Duck.java

public abstract class Duck {protected FlyBehavior flyBehavior;protected QuackBehavior quackBehavior;public void setFlyBehavior(FlyBehavior flyBehavior) {this.flyBehavior = flyBehavior;}public void setQuackBehavior(QuackBehavior quackBehavior) {this.quackBehavior = quackBehavior;}public void setAppearance(String appearance) {this.appearance = appearance;}private String appearance;public void fly() { flyBehavior.fly(); }public void quack() { quackBehavior.quack(); }public void display(){System.out.println(appearance);}
}

3.FlyBehavior.java

public interface FlyBehavior{public void fly();
}

4.FlyNoWay.java

public class FlyNoWay implements FlyBehavior {public void fly() {System.out.println("不能飞行");}
}

5.FlyWithWings.java

public class FlyWithWings implements FlyBehavior {public void fly() {System.out.println("使用翅膀飞行");}
}

6.MallardDuck.java

public class MallardDuck extends Duck {MallardDuck(){super();super.setAppearance("灰白羽毛");super.setQuackBehavior(new Quack());super.setFlyBehavior(new FlyWithWings());}
}

7.Quack.java

public class Quack implements QuackBehavior {public void quack() {System.out.println("发出“嘎嘎”声");}
}

8.QuackBehavior.java

public interface QuackBehavior{public void quack();
}

9.QuackNoWay.java

public class QuackNoWay implements QuackBehavior {public void quack() {System.out.println("不能发声");}
}

10.RedHeadDuck.java

public class RedHeadDuck extends Duck{RedHeadDuck() {super();super.setAppearance("灰色制毛红头");super.setQuackBehavior(new Quack());super.setFlyBehavior(new FlyWithWings());}
}

11.RubherDuck.java

public class RubherDuck extends Duck{RubherDuck() {super();super.setAppearance("黑橡皮白色");super.setQuackBehavior(new Squeak());super.setFlyBehavior(new FlyNoWay());}
}

12.Squeak.java


public class Squeak implements QuackBehavior {public void quack() {System.out.println("发出橡皮与空气摩擦声");}
}

实验08 软件设计模式及应用相关推荐

  1. 软件设计模式与体系结构实验——3.1-1组合模式的应用

    链接: 软件设计模式与体系结构实验--2.1-1(2)(抽象)工厂模式的应用 链接: 软件设计模式与体系结构实验--2.2-1生成器模式的应用 链接: 软件设计模式与体系结构实验--2.3-1单列模式 ...

  2. 软件设计模式之责任链模式实验

    软件设计模式之责任链模式实验 一.实验目的 掌握软件责任链模式中的命令模式,能够用责任链模式编写程序,解决实际问题. 二.实验内容与要求 内容:某小学老师指定班里的三位学生收寒假作业,三位学生分别负责 ...

  3. 软件设计模式之中介者模式实验

    软件设计模式之中介者模式实验 一.实验目的 掌握软件设计模式中的中介者模式,能够用中介者模式编写程序,解决实际问题. 二.实验内容与要求 内容:有个租房中介为房主和租赁人提供租房服务,请用中介者模式对 ...

  4. 《软件工程》实验报告——软件设计

    一.实验目的 掌握Axure RP软件基本用法: 掌握软件体系结构设计: 了解常用软件设计模式: 将实验过程中形成的图形.文字内容插入本文档. 二.实验内容 1.当前Web前端最经典的软件体系结构模式 ...

  5. 软件设计模式(观察者模式)——模拟股票价格变动并绘制分时图和K线图

    一.观察者模式简介: 首先看百度百科上对观察者模式的简介:观察者模式(Observer)完美的将观察者和被观察的对象分离开.举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数 ...

  6. java 分时图_软件设计模式(观察者模式)——模拟股票价格变动并绘制分时图和K线图...

    一.观察者模式简介: 首先看百度百科上对观察者模式的简介:观察者模式(Observer)完美的将观察者和被观察的对象分离开.举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数 ...

  7. 软件设计模式-7种设计原则总结

    7 种设计原则是软件设计模式必须尽量遵循的原则,各种原则要求的侧重点不同.其中,开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭:里氏替换原则告诉我们不要破坏继承体系:依赖倒置原则告诉我们要面向接口 ...

  8. 软件测试和系统试验,实验四 软件系统性测试

    <实验四 软件系统性测试>由会员分享,可在线阅读,更多相关<实验四 软件系统性测试(9页珍藏版)>请在人人文库网上搜索. 1.软 件 学 院上 机 实 验 报 告课程名称: 软 ...

  9. [摘抄]软件设计模式的几个原则

    原文地址:软件设计模式的几个原则 模式是一种对现实世界的概念抽象,建筑模式,设计模式,营销模式,商业运作模式各行各业都有自己的模式. 这里说的设计模式是软件设计里的模式,主要是指面向对象的软件设计.遵 ...

最新文章

  1. VBA赋值给指定单元格
  2. 通过python实现linux切换用户_Python实现在Linux系统下更改当前进程运行用户
  3. XVID基本参数解析
  4. 深入理解 JVM Class文件格式(二)
  5. Android studio中获取按钮组的信息如何循环遍历
  6. vSphere ESXi 5.5网络问题两例及解决方法
  7. ...............
  8. Mac安装 nginx (极简)
  9. 3709: [PA2014]Bohater
  10. 知识分享之项目管理——PDCA原则
  11. 狂神 MyBatis
  12. 怎么样向云服务器上传文件_如何上传文件到阿里云服务器?
  13. iOS 直播间送礼物逻辑(礼物连击)
  14. 容器内存溢出排障思路
  15. Idea 链接mysql数据库失败 Schemas中为空
  16. 基于Open vSwitch的传统限速和SDN限速--实验
  17. matlab 重复博弈,博弈论-囚徒困境与重复囚徒困境的启示
  18. 关于数据仓库 — ODS概念
  19. Neodynamic Barcode Professional for Windows Forms 14.0
  20. bzoj 4605 崂山白花蛇草水

热门文章

  1. R语言给数据集创建新变量
  2. 【JDBC】idea添加mysql-jar包(很轻松)
  3. cocoscreator修改鼠标图标样式
  4. 系统学习深度学习(十五)--AlexNet译文
  5. 项目一:瑞吉点餐中遇到的问题集
  6. 六级单词--词根词缀篇
  7. python爬虫---某站排名100
  8. 408计算机网络学习笔记——计算机网络体系结构
  9. nginx php permanent,Nginx permanent重定向参数问题
  10. 2020江苏选调考察体检环节的记录