1099111130设计模式实验报告

更新时间:2024-07-05 18:36:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

哈尔滨工业大学华德应用技术学院

实 验 报 告

课程名称: 软件设计模式 系 别: 计算机应用技术系 专 业: 软件工程 学 号: 1099111130 姓 名: 陈天任

学 期: 2012年春季学期 实验成绩:

计算机应用技术系 监制

实验名称一:单例模式 实验时间:2012.4.21 学时:2 实验地点:s203 实验目的:掌握饿式单例、懒式单例模式的基本实现形式,并体会两种实现方式的特点。掌握单例模式的基本应用。 实验步骤: 在项目的开发过程中,经常需要读取配置文件,根据配置文件的参数决定具体的软件业务逻辑。ReadConfig.java程序实例实现了从配置文件”zzr.ini”文件中读取data参数值的功能。 zzr.ini 文件内容如下:data=123456789 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class ReadConfig {

private String paramA; public ReadConfig() { } public String getParamA() {return paramA;} public void setParamA(String paramA) { } - 1 -

Properties p=new Properties(); try { } catch (FileNotFoundException e) { { } e.printStackTrace(); e.printStackTrace(); } catch (IOException e) p.load(new FileInputStream(\)); this.paramA=p.getProperty(\); this.paramA = paramA;

public static void main(String args[]) { ReadConfig rc=new ReadConfig(); System.out.println(\配置文件的值为:\+rc.getParamA());} } 1、运行如上程序写出运行结果 配置文件的值为:123456789 2、如上程序,参照JDK帮助文档,逐行写出注释。 import java.io.*;//引入IO包 import java.util.Properties;//引入util包的Properties类 public class ReadConfig //创建ReadConfig类 { private String paramA;//定义个私有的字符串 public ReadConfig() //第一构造方法 { Properties p=new Properties();//new 一个Propertier类的实例 try //抓文件不存在和io异常 { p.load(new FileInputStream(\));//创建连接文件的流 this.paramA=p.getProperty(\);//设置paramA的值等于文件中的DATA的属性 } } public String getParamA() //定义一个方法返回字符串类型的paramA的值 {return paramA;} public void setParamA(String paramA) //定义一个方法设置paramA的值 {this.paramA = paramA;} public static void main(String args[])//main 主方法 { ReadConfig rc=new ReadConfig();//实例化ReadConfig一个实例 System.out.println(\配置文件的值为:\+rc.getParamA());//输出catch (FileNotFoundException e)//处理异常 { e.printStackTrace();//在控制台显示异常,给开发者看的 } catch (IOException e) { } e.printStackTrace(); paramA的值 } }

- 2 -

3、在程序中,通过new ReadConfig();来得到配置文件的内容。在一个项目中,有可能多处使用配置文件,就需要我们多次进行new操作。每一次的new都是一次读取外部文件的过程,然后将读取到得的参数值,放到内存中。这样势必会造成系统资源的浪费。把如上问题总结一下:能不能再系统运行的过程中,控制某个类仅有一个实例。 import java.io.*; import java.util.Properties; public class ReadConfig { private static String paramA=null; private static ReadConfig rc=null; private ReadConfig() { } public static synchronized ReadConfig getIntance() { if(rc == null) { } return rc;} public String getParamA() {return paramA;} public static void main(String args[]) { ReadConfig fq=ReadConfig.getIntance(); System.out.println(\配置文件的值为:\+fq.getParamA());} } rc=new ReadConfig(); Properties p=new Properties(); try { } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) {e.printStackTrace();} p.load(new FileInputStream(\)); paramA=p.getProperty(\); 实验总结:通过实验对单例模式有了深刻的理解。知道了单例模式具体两种的的使用方法和何时使用单例模式等。

- 3 -

实验名称二:简单工厂模式 实验时间:2012.4.21 学时:2 实验地点:s203 实验目的:掌握简单工厂模式的基本实现形式。体会单工厂模式的特点。掌握单工厂模式的基本应用。 实验步骤: IUserDAO.java public interface IUserDAO {void getUserByID(int id);} MSServerDAO.java public class MSServerUserDAO implements IUserDAO { public void getUserByID(int id) { }} System.out.println(\+id); Factory.java public class factory { } Zzr.java

- 4 -

public static IUserDAO createISD(int a) { } IUserDAO user = null; if(a == 1) { } return user; user = new MSServerUserDAO();

public class zzr { public static void main(String[] args) { }} IUserDAO fq = factory.createISD(1); fq.getUserByID(7); 3.3 扩展IUserDAO接口实现---->MySqlUserDAO,并且完成客户端,对扩展功能的调用。 IUserDAO.java public interface IUserDAO { void getUserByID(int id);} MSServerDAO.java public class MSServerUserDAO implements IUserDAO { public void getUserByID(int id) { }} System.out.println(\+id); MySqlUserDAO.java public class MySqlUserDAO implements IUserDAO { public void getUserByID(int id) { }} System.out.println(\+id); Factory.java public class factory { } Zzr.java public class zzr { public static void main(String[] args) { } } IUserDAO fq = factory.createISD(1); fq.getUserByID(7); } public static IUserDAO createISD(int a) { IUserDAO user = null; if(a == 1) { user = new MSServerUserDAO(); } return user; 实验总结:通过实验的学习知道何时应用简单工厂模式和使用简单工厂带来的好处。

- 5 -

实验名称三:工厂方法模式 实验时间:2012.5.7 学时:2 实验地点: 实验目的:掌握工厂方法模式的基本实现形式,体会工厂方法模式的特点,掌握工厂方法模式的基本应用。 实验步骤:实现一个导出数据的框架,来让用户选择数据的导出方式,要求导出的数据格式:xml,txt。具体的导出方法只提供示意实现即可,重点体会框架的总体设计。 public interface Send { } public class XMLSend implements Send {

void send(); public void send() { System.out.println(\导出\); - 6 -

} } public class TXTSend implements Send { } public abstract class SendFactory { } public class XMLFactory extends SendFactory { } public class TXTFactory extends SendFactory { } public class Fanqiang { } public static void main(String[] args) { } SendFactory zzr = new TXTFactory(); zzr.getFactoryMethod(); public Send factoryMethod() { } return new TXTSend(); public Send factoryMethod() { } return new XMLSend(); public abstract Send factoryMethod(); public void getFactoryMethod(){ } factoryMethod().send(); public void send() { System.out.println(\导出\); } 3.4 用户对于此框架,提出了新的需求,要求可以导出数据库格式的数据文件。 public interface Send { } public class XMLSend implements Send { } public class TXTSend implements Send {

void send(); public void send() { System.out.println(\导出\); } public void send() { - 7 -

} System.out.println(\导出\); } public class SQLSend implements Send { } public abstract class SendFactory { } public class XMLFactory extends SendFactory { } public class TXTFactory extends SendFactory { } public class SQLFactory extends SendFactory { public Send factoryMethod() { return new SQLSend(); }} public Send factoryMethod() { } return new TXTSend(); public Send factoryMethod() { } return new XMLSend(); public abstract Send factoryMethod(); public void getFactoryMethod(){ } factoryMethod().send(); public void send() { System.out.println(\导出\); } public class Fanqiang { public static void main(String[] args) { SendFactory zzr = new TXTFactory(); zzr.getFactoryMethod(); } } 实验总结:学习了工厂方法模式,经过实验了解工厂方法的优点和缺点以及和简单工厂的区别。

- 8 -

实验名称四:抽象工厂模式 实验时间:2012.5.7 学时:2 实验地点:s203 实验目的:掌握抽象工厂模式的基本实现形式。体会抽象工厂模式的特点。掌握抽象工厂模式的基本应用。 实验步骤: public interface 主板 { void installCPU(); } public class AMD主板 implements 主板 { public void installCPU() { System.out.println(\我是AMD主板\); } } public class Intel主板 implements 主板 { public void installCPU() { System.out.println(\我是Intel主板\); } }

- 9 -

public interface CPU { } public class IntelCPU implements CPU { } public class AMDCPU implements CPU { } public interface 抽象工厂 { 主板 get主板(); CPU getCPU(); } public class AMD工厂 implements 抽象工厂 { } public class Intel工厂 implements 抽象工厂 { public 主板 get主板() { return new Intel主板();} public CPU getCPU() { return new IntelCPU(); }} public class Fanqiang { public static void main(String[] args) { 抽象工厂 zzr = new Intel工厂(); zzr.get主板().installCPU(); zzr.getCPU().run(); }} public 主板 get主板() { return new AMD主板(); } } return new AMDCPU(); public void run() { System.out.println(\我是AMDCPU\); } public void run() { System.out.println(\我是IntelCPU\); } void run(); public CPU getCPU() { 实验总结:在实验中深刻的理解了抽象工厂方法模式,在具体应用中比较了与前两种模式的不同之处 。

- 10 -

实验名称五:策略模式 实验时间:2012.0515 学时:2 实验地点:s203 实验目的:掌握策略模式的基本实现形式。体会策略模式的特点。掌握策略模式的基本应用。 实验步骤: 向客户报价,并不是一件容易的事情,需要考虑的因素特别多,就使得我们的程序需要考虑很多事情,比如客户身份的不同,会影响到报价的结果。再比如客户购买的物品数量和金额,同样会对最后的报价有影响,此实例仅考虑如下需求: (1)对普通客户或者是新客户报全价。 (2)对老客户报的价格,统一折扣5% (3)对大客户报的价格,统一折扣10% 3.2报价管理框架类图: (1)策略 public interface 策略 {public double 计算报价(double price);} (2)普通用户 public class 普通用户 implements 策略 { public double 计算报价(double price) { System.out.println(\对于普通客户,没有折扣\); return price; }} (3)老客户 public class 老客户 implements 策略 { public double 计算报价(double price) { System.out.println(\对于老客户,统一折扣5%\); return price*(1-0.05); }} (4)大客户

- 11 -

public class 大客户 implements 策略 { public double 计算报价(double price) { System.out.println(\对于老客户,统一折扣10%\); return price*(1-0.1); }} (5)报价 public class 报价 { private 策略 strategy = null; public 报价(策略 strategy){ this.strategy = strategy; } }} public double 获得价格(double price){ return this.strategy.计算报价(price); (6)Client客户端 public class Client { public static void main(String[] args) { 策略 strategy = new 大客户(); 报价 ctx = new 报价(strategy); double quote = ctx.获得价格(1000); System.out.println(\向客户报价:\+quote); }} 3.4、用户需求发生变化:除了上述的普通用户、老用户和大客户。又多了一类ZZR客户,这类客户统一折扣95%。请完善此应用扩展,完善代码。 public class ZZR implements 策略{ public double 计算报价(double price) { } } public class Client { } public static void main(String[] args) { 策略 strategy = new ZZR(); 报价 ctx = new 报价(strategy); double quote = ctx.获得价格(1000); System.out.println(\对于ZZR这样的客户,统一打95折\); return price*0.95; System.out.println(\向客户报价:\+quote); } 实验总结:通过实验掌握了策略模式和策略模式的拓展。也了解了应用策略模式的具体情况。

- 12 -

实验名称六:模板方法模式 实验时间:2012.05.15 学时:2 实验地点:s206 实验目的:掌握模板方法模式的基本实现形式,体会模板方法模式的特点,掌握模板方法模式的基本应用。 实验步骤: public abstract class 喝水模型 { public abstract void 倒水(); public abstract void 说话(); public abstract void 撞杯(); public abstract void 喝(); public boolean ff(){return true;} public void 喝水(){ this.倒水(); this.说话(); if(ff())this.撞杯(); this.喝();}} public class 软工 extends 喝水模型{ public void 倒水() { System.out.println(\);} public void 喝() { System.out.println(\);} public void 撞杯() { System.out.println(\);} public void 说话() { System.out.println(\);} public boolean ff() {return false;}} public class 客户端 { public static void main(String[] args) { } 喝水模型 m = new 软工(); m.喝水(); } 实验总结:通过实验掌握了模板方法模式。学习了钩子方法以及如何绘制UML图,也辅助复习了UML。

- 13 -

实验名称七:原型模式 实验时间:2012.05.21 学时:4 实验地点:s203 实验目的:掌握原型模式的基本实现形式,体会原型模式的特点,掌握原型模式的基本应用。 实验步骤: Book类; public class Book implements Cloneable {

private String name; private float price; private String author; private String owner; private String press; public String getName() { } public void setName(String name) { } public float getPrice() { } public void setPrice(float price) { } public String getAuthor() { } public void setAuthor(String author) { } public String getOwner() { } public void setOwner(String owner) { } - 14 -

return name; this.name = name; return price; this.price = price; return author; this.author = author; return owner; this.owner = owner;

public String getPress() { } public void setPress(String press) { } public String toString() { } public Object clone() throws CloneNotSupportedException { } } return super.clone(); return name+price+author+owner+press; this.press = press; return press; Lili类; public class Lili { public static void main(String[] args) throws } } Book a = new Book(); a.setAuthor(\); a.setName(\程序设计\); a.setOwner(\); a.setPress(\清华大学出版社\); a.setPrice(29.50f); Book b = (Book)a.clone(); b.setOwner(\); System.out.println(a); System.out.println(b); CloneNotSupportedException { 实验总结:通过实验了解了原型模式的结构的优点和缺点。还知道了适用场景。

- 15 -

public String getPress() { } public void setPress(String press) { } public String toString() { } public Object clone() throws CloneNotSupportedException { } } return super.clone(); return name+price+author+owner+press; this.press = press; return press; Lili类; public class Lili { public static void main(String[] args) throws } } Book a = new Book(); a.setAuthor(\); a.setName(\程序设计\); a.setOwner(\); a.setPress(\清华大学出版社\); a.setPrice(29.50f); Book b = (Book)a.clone(); b.setOwner(\); System.out.println(a); System.out.println(b); CloneNotSupportedException { 实验总结:通过实验了解了原型模式的结构的优点和缺点。还知道了适用场景。

- 15 -

本文来源:https://www.bwwdw.com/article/9ue.html

Top