实验08 软件设计模式及应用

目录

实验目的

(1) 理解设计模式的基本概念

(2) 理解设计模式遵循的原则

(3) 掌握经典设计模式及应用

实验内容

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

理解开-闭原则(Open-Closed Principle,OCP--对扩展开放-而对修改关闭

Sound.java

cpp 复制代码
public interface Sound {
    public abstract void playSound();
}

Dog.java

cpp 复制代码
public class Dog implements Sound{
    public void playSound(){
        System.out.println("汪汪...汪汪");
    }
}

Violin.java

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

Simulator.java

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

Application.java

cpp 复制代码
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();
    }
}

运行结果

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

女娲架起了八卦炉(技术术语:建立工厂),开始造人。

过程如下:先捏泥巴成人形,再放入八卦炉里烤,最后扔到地上成长。时间烤短了,造出了"白种人";时间烤长了,造出了"黑种人";时间烤得不长不短,造出了"黄种人"。

Human.java

cpp 复制代码
public interface Human {
    public void talk();
}

WhiteHuman.java

cpp 复制代码
public class WhiteHuman implements Human{
    public void talk(){
        System.out.println("Hello");
    }
}

YellowHuman.java

cpp 复制代码
public class YellowHuman implements Human{
    public void talk(){
        System.out.println("您好");
    }
}

BlackHuman.java

cpp 复制代码
public class BlackHuman implements Human{
    public void talk(){
        System.out.println("i am a BlackHuman");
    }
}

HumanFactory.java

cpp 复制代码
public class HumanFactory {
    public static Human createHuman(String s){
        Human human=null;
        if (s.equals(new String("WhiteHuman"))){
            human=new WhiteHuman();
        }
        else if (s.equals(new String("YellowHuman"))){
            human=new YellowHuman();
        }
        else if (s.equals(new String("BlackHuman"))){
            human=new BlackHuman();
        }
        return human;
    }
}

NvWa.java

cpp 复制代码
public class NvWa {
    public static void main(String[] args) {
        Human human=null;
        human=HumanFactory.createHuman("WhiteHuman");
        human.talk();
        human=HumanFactory.createHuman("YellowHuman");
        human.talk();
        human=HumanFactory.createHuman("BlackHuman");
        human.talk();
    }
}

运行结果

三、工厂方法模式--女娲造人。

Human.java

cpp 复制代码
public interface Human {
    public void talk();
}

WhiteHuman.java

cpp 复制代码
public class WhiteHuman implements Human{
    public void talk(){
        System.out.println("Hello");
    }
}

YellowHuman.java

cpp 复制代码
public class YellowHuman implements Human{
    public void talk(){
        System.out.println("您好");
    }
}

BlackHuman.java

cpp 复制代码
public class BlackHuman implements Human{
    public void talk(){
        System.out.println("i am a BlackHuman");
    }
}

HumanFactory.java

cpp 复制代码
public interface HumanFactory {
    public Human createHuman();
}

WhiteHumanF.java

cpp 复制代码
public class WhiteHumanF implements HumanFactory{
    public Human createHuman(){
        return new WhiteHuman();
    }
}

YellowHumanF.java

cpp 复制代码
public class YellowHumanF implements HumanFactory{
    public Human createHuman(){
        return new YellowHuman();
    }
}

BlackHumanF.java

cpp 复制代码
public class BlackHumanF implements HumanFactory{
    public Human createHuman(){
        return new BlackHuman();
    }
}

NvWa.java

cpp 复制代码
public class NvWa {
    public static void main(String[] args) {
        HumanFactory humanFactory=null;
        Human human=null;
        humanFactory=new WhiteHumanF();
        human=humanFactory.createHuman();
        human.talk();
        humanFactory=new YellowHumanF();
        human=humanFactory.createHuman();
        human.talk();
        humanFactory=new BlackHumanF();
        human=humanFactory.createHuman();
        human.talk();
    }
}

运行结果

四、适配器模式--交流电转直流电。

用户家里现有一台洗衣机,洗衣机使用交流电,现在用户新买了一台录音机,录音机只能使用直流电。由于供电系统供给用户家里的是交流电,因此用户需要用适配器将交流电转化直流电供录音机使用。

AlternateCurrent.java

java 复制代码
public interface AlternateCurrent {
    public String giveAlternateCurrent();
}

PowerCompany.java

java 复制代码
public class PowerCompany implements AlternateCurrent{
    public String giveAlternateCurrent(){
        return "10101010101010101010";
    }
}

DirectCurrent.java

java 复制代码
public interface DirectCurrent {
    public String giveDirectCurrent();
}

ElectricAdapter.java

java 复制代码
public class ElectricAdapter implements DirectCurrent {
    AlternateCurrent out;
    ElectricAdapter (AlternateCurrent out){
        this.out=out;
    }
     public String giveDirectCurrent(){
         String m=out.giveAlternateCurrent();
         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;
     }
}

Wash.java

java 复制代码
public class Wash {
    String name;
    Wash(){
        name="洗衣机";
    }
    public void turnOn(AlternateCurrent a){
        String s =a.giveAlternateCurrent();
        System.out.println(name+"使用交流电:\n"+s);
        System.out.println("开始洗衣物");
    }
}

Recorder.java

java 复制代码
public class Recorder {
    String name;
    Recorder (){
        name="录音机";
    }
    public void turnOn(DirectCurrent a){
        String s=a.giveDirectCurrent();
        System.out.println(name+"使用直流电:\n"+s);
        System.out.println("开始录音");
    }
}

Application.java

java 复制代码
public class Application {
    public static void main(String[] args) {
        AlternateCurrent aElectric =new PowerCompany();
        Wash wash=new Wash();
        wash.turnOn(aElectric);
        DirectCurrent dElectric=new ElectricAdapter(aElectric);
        Recorder recorder=new Recorder();
        recorder.turnOn(dElectric);
    }
}

运行结果

五、策略模式--评分方案

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

Strategy.java

java 复制代码
public interface Strategy {
    public double computerAverage(double []a);
}

StrategyA.java

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;
    }
}

StrategyB.java

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;
    }
}

AverageScore.java

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

Application.java

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);
    }
}

运行结果

相关推荐
Zane19944 小时前
工厂方法一定比简单工厂高级?三种工厂模式到底该怎么选
设计模式
Hespethorn5 小时前
设计模式是语言缺陷的补丁 —— 从工厂、单例、策略三个模式说起
设计模式
Lost of 程序猿5 小时前
命令模式实战:把“下单后的动作“打包成可执行的任务
后端·设计模式·c#·asp.net·命令模式
一只旭宝5 小时前
【C++复习】四种类型转换 + 常见设计模式 + Redis/MySQL(后端面试复习完整版)
c++·redis·笔记·mysql·设计模式
YYYing.6 小时前
【设计模式系列 (四) 】建造者模式
c++·后端·设计模式·建造者模式·c/c++
Zane19941 天前
同一段单例代码,为什么在高并发下偶尔会创建出两个实例?聊聊哪种单例实现才是真的安全
设计模式
Carl_奕然1 天前
【智能体】Loop 的四种设计模式之:Agent Loop(2026 最新版)
人工智能·设计模式·语言模型
小酒星小杜1 天前
画 AI 漫画,别只会写“日漫风”:10 种画风、适用故事和可复制提示词
人工智能·设计模式·程序员
sarasuki2 天前
为什么 Agent 工具需要一个「协议」而不是「框架」:MCP 成为标准的底层逻辑
设计模式·agent·mcp
vivo互联网技术2 天前
知识不是文件,也不是向量 | KDC 系列 02
人工智能·设计模式·架构